我是Django的新手,我正在开发一个以登录页面作为索引和注册页面的项目。其余页面都必须限制为登录用户,如果未经身份验证的用户尝试联系他们,则必须将他/她重定向到登录页面。
我看到@login_required
装饰器会将单个视图限制为已登录的用户,但有没有更好的方法来限制所有视图,只有少数可供未经身份验证的用户使用?
答案 0 :(得分:4)
您可以编写中间件:
from django.contrib.auth.decorators import login_required
def login_exempt(view):
view.login_exempt = True
return view
class LoginRequiredMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
return self.get_response(request)
def process_view(self, request, view_func, view_args, view_kwargs):
if getattr(view_func, 'login_exempt', False):
return
if request.user.is_authenticated:
return
# You probably want to exclude the login/logout views, etc.
return login_required(view_func)(request, *view_args, **view_kwargs)
您将中间件添加到MIDDLEWARES
列表中并装饰您不希望使用login_exempt
进行身份验证的视图。
答案 1 :(得分:1)
...有没有更好的方法来限制所有视图,只有少数可供未经身份验证的用户使用?
是。现在是时候学习class based views了。定义需要登录的基类,并使任何经过身份验证的端点继承此基类,而不是在每个函数上使用带有装饰的基于函数的视图。
实现中的流行设计模式是使用mixin class:
from django.contrib.auth.mixins import LoginRequiredMixin
class MyView(LoginRequiredMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'
如果视图使用此mixin,则未经过身份验证的用户的所有请求都将重定向到登录页面。