我是Django的新手,我正在做一个项目,这个项目有一个登录页面作为索引,还有一个注册页面。其余的页面都必须限制为登录用户,如果一个未经验证的用户试图访问他们,他/她必须被重定向到登录页面。我看到@login_required装饰器会将单个视图限制为登录用户,但是有没有更好的方法来限制所有视图,只有少数视图可供未经身份验证的用户使用?
@login_required
a0x5cqrl1#
您可以编写一个中间件:
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进行身份验证的视图。
MIDDLEWARES
login_exempt
um6iljoc2#
...是否有更好的方法来限制所有视图,只有少数视图可供未经身份验证的用户使用?这是class based views的一个很好的用例,定义一个带有登录处理的基类,比如LoginRequiredView,并使任何经过身份验证的端点成为这个基类的子类,而不是使用基于函数的视图,在每个函数上都进行修饰。未认证用户可用的少数视图将继承自Django的通用View,而不是登录所需的基础。Django实际上提供了一个mixin类,你可以用途:
LoginRequiredView
View
from django.contrib.auth.mixins import LoginRequiredMixin class LoginRequiredView(LoginRequiredMixin, View): login_url = '/login/' redirect_field_name = 'redirect_to'
当一个视图使用这个mixin,或者用mixin子类化一个基类时,未经身份验证的用户的请求将被重定向到登录页面。
2条答案
按热度按时间a0x5cqrl1#
您可以编写一个中间件:
将中间件添加到
MIDDLEWARES
列表中,并装饰不希望使用login_exempt
进行身份验证的视图。um6iljoc2#
...是否有更好的方法来限制所有视图,只有少数视图可供未经身份验证的用户使用?
这是class based views的一个很好的用例,定义一个带有登录处理的基类,比如
LoginRequiredView
,并使任何经过身份验证的端点成为这个基类的子类,而不是使用基于函数的视图,在每个函数上都进行修饰。未认证用户可用的少数视图将继承自Django的通用
View
,而不是登录所需的基础。Django实际上提供了一个mixin类,你可以用途:
当一个视图使用这个mixin,或者用mixin子类化一个基类时,未经身份验证的用户的请求将被重定向到登录页面。