request.user decorators.py returns 与自己不同的结果。request.user views.py

request.user in decorators.py returns different results to self.request.user in views.py

我在我的 'decorators.py' 文件中创建了一个装饰器 'unauthenticated_user(view_func)',如果当前用户未通过身份验证,它会限制用户访问视图。

在 'unauthenticated_user()' 函数中,有一个条件 'request.user.is_authenticated' 如果附加到令牌的用户已通过身份验证,则该条件 return 应为真。但是,在测试此函数时,我注意到 'decorators.py' 中的 'request.user' 并不总是等于 'views.py' 中 'self.request.user' 编辑的正确值 return。相反,它通常 return 以前登录过的用户,或者 'AnonymousUser' 破坏了功能。

decorators.py:

def unauthenticated_user(view_func):
    def wrapper_func(request, *args, **kwargs):
        if request.user.is_authenticated:
            return view_func(request, *args, **kwargs)
        else:
            return HttpResponse('No user logged in')

    return wrapper_func

views.py:

@method_decorator(unauthenticated_user, name = 'dispatch')
class UserLogout(APIView):
    ...

这是我一直用来测试当 decorators.py 函数 returns 'AnonymousUser':

class Current(APIView):
    def get(self, request, format = None):
        try:
            return Response(self.request.user.is_authenticated)
        except:
            return Response("no user currently logged in")

如何确保 'decorators.py' 'unauthenticated_user' 函数可以访问当前请求中的用户,就像 'views.py' 中的 'Current' 视图一样?

如有任何帮助,我们将不胜感激。据我所知,无法在 'decorators.py' 函数中调用 'self'。

谢谢,格雷

由于您使用的是 DRF,因此您应该使用视图的 IsAuthenticated 权限 class

from rest_framework.views import APIView
<b>from rest_framework.permissions import IsAuthenticated</b>
from rest_framework.response import Response


class MyAPIView(APIView):
    <b>permission_classes = (IsAuthenticated,)</b>

    def get(self, request, *args, **kwargs):
        return Response({"msg": "Some message"})