2011-01-27 106 views
2

默认情况下,当使用@login_required修饰符时,Django在将未经身份验证的用户重定向到登录页面时执行302(临时)重定向。我和一家SEO公司(我自己对这个话题一无所知)一起工作,他坚持认为301(永久性)重定向对他正在做的工作是必不可少的。关于@login_required修饰符和重定向类型的问题

有没有办法强制Django在使用@login_required装饰器时执行301重定向?

再次感谢。

+7

301永久重定向在这里似乎不对。假设你正在保护URL`/ secret-sauce/recipe`。如果我没有登录并点击`/ secret-sauce/recipe`,那么我应该重定向到登录页面。 *但是*该页面并未永久移动; `/ secret-sauce/recipe`仍然是一个有效的URL(我登录后应该重定向*返回*)。当页面移动并在旧URL无效时使用301。 – mipadi 2011-01-27 18:38:50

+6

典型的SEO专家:不知道他在说什么... :-) – 2011-01-27 19:31:31

回答

4

@login_required修饰器使用redirect_to_login视图,该视图返回一个Django HttpResponseRedirect对象以将用户重定向到登录页面。如你所说,这个对象表示一个302重定向。还有一个替代重定向对象,HttpResponsePermanentRedirect,尽管您需要编写自己的装饰器来代替它。

当然,编写自己的装饰器是可能的。在我看来,这将是不好的做法。不仅仅是因为它将您的应用程序与验证模块的特定实现绑定在一起,而且还因为在这种情况下302重定向实际上是正确的。

事实是,页面没有“永久移动”。相反,用户只需再次访问相同的URL之前就需要对自己进行身份验证。出于这个原因,重定向不是永久的,因为页面实际上没有“移动”。