问题描述
我在'decorators.py'文件中创建了一个装饰器'unauthenticated_user(view_func)',如果当前用户未通过身份验证,该装饰器将限制用户访问视图。
在“ unauthenticated_user()”函数中,有一个条件“ request.user.is_authenticated”,如果对令牌附加的用户进行了身份验证,则应返回true。但是,在测试此功能时,我注意到“ decorators.py”中的“ request.user”并不总是等于“ views.py”中“ self.request.user”返回的正确值。取而代之的是,它通常会返回以前登录的用户,或者返回“ AnonymousUser”,这会破坏功能。
decorators.py:
def unauthenticated_user(view_func):
def wrapper_func(request,*args,**kwargs):
if request.user.is_authenticated:
return view_func(request,**kwargs)
else:
return HttpResponse('No user logged in')
return wrapper_func
views.py:
@method_decorator(unauthenticated_user,name = 'dispatch')
class Userlogout(APIView):
...
这是我用来测试当decorators.py函数返回'AnonymousUser'时实际上是否有经过身份验证的用户的views.py函数:
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”中的“当前”视图一样?
任何帮助将不胜感激。据我所知,在“ decorators.py”函数中无法调用“自我”。
谢谢,Grae
解决方法
由于使用的是DRF,因此应使用视图的IsAuthenticated
权限类
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
class MyAPIView(APIView):
permission_classes = (IsAuthenticated,)
def get(self,request,*args,**kwargs):
return Response({"msg": "Some message"})