使用方法装饰器重定向到视图时,用户将变为匿名

时间:2019-05-09 06:17:11

标签: django authentication django-rest-framework django-views

我的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)

0 个答案:

没有答案