2011-01-27 5 views
2

По умолчанию при использовании декоратора @login_required Django выполняет перенаправление 302 (временное) при перенаправлении не аутентифицированного пользователя на страницу входа в систему. Я работаю совместно с компанией SEO (я сам ничего не знаю о теме), и он настаивает на том, что 301 (постоянный) перенаправление имеет важное значение для работы, которую он выполняет.Вопрос о @login_required decorator и тип перенаправления

Есть ли способ заставить Django выполнить перенаправление 301 при использовании декоратора @login_required?

Еще раз спасибо.

+7

Перманентное перенаправление 301 здесь кажется неправильным. Допустим, вы защищаете URL '/ secret-sauce/recipe'. Если я не вошел в систему и не ударил '/ secret-sauce/recipe', тогда мне нужно перенаправить на страницу входа. * Но * эта страница не перемещается постоянно; '/ secret-sauce/recipe' по-прежнему является действительным URL (и я должен перенаправить его обратно), как только я войду в систему). 301 используется, когда страница перемещена и недействительна по старому URL. – mipadi

+6

Типичный эксперт по SEO: понятия не имеет, о чем он говорит ... :-) –

ответ

4

Декоратор @login_required использует вид redirect_to_login, который возвращает объект Django HttpResponseRedirect, чтобы перенаправить пользователя на страницу входа. Этот объект представляет, как вы упоминаете, перенаправление 302. Существует альтернативный объект перенаправления, HttpResponsePermanentRedirect, хотя вам нужно будет написать свой собственный декоратор, который использует это вместо этого.

Написание собственного декоратора, конечно, возможно. На мой взгляд, это была бы плохая практика. Не в последнюю очередь потому, что оно связывает ваше приложение с конкретной реализацией модуля аутентификации, но также потому, что перенаправление 302 на самом деле является правильным для использования в этом случае.

Дело в том, что страница не «перемещалась постоянно». Вместо этого пользователю просто нужно пройти аутентификацию, прежде чем обращаться к одному и тому же URL еще раз. По этой причине перенаправление не является постоянным, поскольку страница на самом деле не «перемещена».

+1

Кстати, браузеры обычно кэшируют эти постоянные переадресации. Поэтому permenent_redirect в этой ситуации может закончиться циклом перенаправления в браузере пользователя. – Ski

2

Нет, тип перенаправления не может быть изменен только с использованием только login_required. Вы можете написать свой собственный login_required декоратора, чтобы обеспечить 301 редирект (хотя использование этого здесь спорно).

Смежные вопросы