我的Django项目中有一个应用程序,该应用程序在访问视图之前先与用户进行身份验证,然后将其重定向到登录视图。我遇到一个问题,即用户的cookie中可能有一个令牌,这些令牌将他们指定为应该能够查看页面的特殊用户。在我的登录页面代码中,首次访问它们时可能未通过身份验证,因此方法装饰器将重定向到登录页面,登录页面将检查令牌,然后将其重定向到请求的页面。我遇到的问题是,即使在登录页面上对用户进行身份验证之后,在重定向他们时,它们也会在装饰器中显示为匿名用户。谁能解释为什么会这样。
审核代码:
def login_required(function=None, login_url='/login/', redirect_field_name='next'):
actual_decorator = user_passes_test(
lambda u: u.is_authenticated,
login_url=login_url,
redirect_field_name=redirect_field_name
)
if function:
return actual_decorator(function)
return actual_decorator
@method_decorator(login_required, name='dispatch')
class DataViewSet(viewsets.ModelViewSet):
pass
class FormLoginView(FormView): # Form stuff omitted
template_name = 'login.html'
form_class = LoginForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if request.user.is_authenticated:
context['JWT'] = self.request.user.get_token()
return context
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
try:
# Find token
request.user = auth.authenticate(request, token=token)
except jwt.InvalidTokenError:
token = None
if request.user.is_authenticated:
redirect_url = self.request.GET.get('next')
if redirect_url:
return redirect(redirect_url)
return super().dispatch(request, *args, **kwargs)