Пользовательская проверка перенаправления по URL-адресам базы данных

Я использую Flask, Werkzeug для обслуживания приложения (блога). В этом блоге редактор может изменить слаг URL. Что ж, это нормально, но мне нужен способ перенаправить этот старый URL-адрес на новый URL-адрес. Пример: /music/rock-in-rio-2012 О нет, это был 2013 год. Давайте изменим: /music/rock-in-rio-2013

Отлично, теперь запрос выше выполняет запрос с слагом rock-in-rio-2013.

Но для меня важно, чтобы URL-адреса не ломались. Я думаю, что это можно сделать, перехватив запрошенный URL-адрес, прежде чем вызывать какое-либо исключение (например, 404, если модель выдает «получить запись или 404»).

Моя модель Redirect будет хранить эти поля:

old_url = string
new_url = string
created_at = datetime

Как я могу поймать этот URL? Я хотел бы общий способ (правила werkzeug). Это означает, что добавление функции вызова в каждом представлении стоит слишком дорого и кажется избыточным.


person Mauricio Abreu    schedule 18.09.2013    source источник


Ответы (1)


В вашей модели Post (где у вас есть слаг) вы можете переопределить методы .first_or_404 или .get_or_404, чтобы справиться с этим и соответственно подняться. Но я предлагаю определить новый метод для использования в этих обстоятельствах.

Это чистое решение. Логика находится в правильном месте (место, которое знает, что такое информация).

Проблема в том, как управлять редиректами.

Вы можете передать экземпляр redirect вызову abort.

Как в следующем псевдо-коде Python:

class Post(db.Model):
  def get_or_redirect_or_404(self, slug):
    r = self.query.filter_by(new_url, old_url)
    if not r:
      # there's no model. abort normally
      abort(404)
    elseif r.old_url == slug:
      # old url used, we need redirect
      # 
      abort(redirect(... r.new_url ...))
person Paolo Casciello    schedule 18.09.2013
comment
Ваш ответ помог мне понять, чего я пытался достичь (что хорошо). Я работаю над расширением, чтобы подключить его к моделям, чтобы его можно было использовать для любого приложения Flask. - person Mauricio Abreu; 16.10.2013