我有一个django网站,里面有很多网址和观点.现在,我已要求将所有未经过身份验证的用户重定向到某个目标网页.因此,所有视图都必须检查是否user.is_authenticated()
返回到一组新的着陆页.
它可以以一种漂亮的方式完成,而不是弄乱我views.py
/ urls.py
那么多吗?
您可以使用中间件.
像这样的东西将检查用户auth每个请求:
class AuthRequiredMiddleware(object): def process_request(self, request): if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('landing_page')) # or http response return None
文档: process_request
另外,不要忘记在settings.py中启用它
MIDDLEWARE_CLASSES = ( ... 'path.to.your.AuthRequiredMiddleware', )
有一种更简单的方法,只需将"login_url"参数添加到@login_required,如果用户没有登录,他将被重定向到登录页面.你可以在这里找到它
from django.contrib.auth.decorators import login_required @login_required(login_url='/accounts/login/') def my_view(request): ...
从Django 1.10开始,自定义中间件类必须实现新的样式语法.您可以使用以下类来验证用户在尝试访问任何视图时是否已登录.
from django.shortcuts import HttpResponseRedirect class AuthRequiredMiddleware(object): def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # Code to be executed for each request before # the view (and later middleware) are called. response = self.get_response(request) if not request.user.is_authenticated(): return HttpResponseRedirect('login') # Code to be executed for each request/response after # the view is called. return response
查看登录所需装饰的文档
from django.contrib.auth.decorators import login_required @login_required def my_view(request): ...
另一个选择是将它添加到您的urls.py模式,请参阅此答案
urlpatterns = patterns('', (r'^foo/$', login_required(direct_to_template), {'template': 'foo_index.html'}), )