Проверка URL-слагов - PullRequest
0 голосов
/ 25 апреля 2011

Я создаю приложение, в котором многие URL используют шаблон, такой как /foo/bar/<object_id>/<object_name_slug>/, как и многие приложения (включая SO), что само по себе является простым шаблоном для реализации. Однако я не хочу просто слепо игнорировать содержимое поля slug и открывать приложение для таких глупых вещей, как люди, распространяющие подправленный URL-адрес (например, недавно популярный http://www.independent.co.uk/life-style/food-and-drink/utter-PR-fiction-but-people-love-this-shit-so-fuck-it-lets-just-print-it-2269573.html).

Мой план состоит в том, чтобы проверить наличие проблемы в slug, перенаправить на правильный URL, если кто-то заходит на страницу через плохой slug (опять же, как SO). Это было бы тривиально реализовать в представлении, но так как это будет шаблон, используемый во многих представлениях, я хотел бы выделить его во что-то повторно используемое - возможно, в декоратор или промежуточное ПО.

Какой лучший способ сделать это? Может ли декоратор определить, какой шаблон URL совпал с конкретным запросом, чтобы при необходимости он мог генерировать реверс?

Спасибо за идеи.

1 Ответ

1 голос
/ 26 апреля 2011

Вы можете использовать промежуточное программное обеспечение для этого. Перепроверьте идентификатор записи (давайте просто предположим, что вы используете модель Entry для содержимого. Идентификатор в упомянутом вами URL будет, например, 2269573) с его слагом (если, конечно, ваша модель Entry имеет поле слага). Если слаг неверен, просто перенаправьте на нужную страницу.

Для этого создайте класс и присвойте ему метод process_request . Затем добавьте этот класс в настройки MIDDLEWARE_CLASSES.

Process_request принимает параметр request (объект HttpRequest), и у этого объекта есть атрибут пути, который даст вам запрошенный URL-адрес.

На основе этого URL вы можете определить действия, которые необходимо предпринять.

Метод вашего промежуточного класса должен возвращать None или объект HttpRequest. Последний может быть экземпляром django.http.HttpResponseRedirect, что означает, что вы можете перенаправить на правильный URL-адрес (тем самым игнорируя неверный slug).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...