标签:ram 必须 mes ons username war none ade 方法
需求:匿名用户和User都能访问这条url
path(‘host/‘, views.HostView.as_view({‘get‘: ‘list‘})), # 匿名测试
流程:
1、认证时,User访问返Tuer,匿名用户必须返回None,即不处理
# 认证类 class Authentication(object): def authenticate(self, request): token = request.GET.get(‘token‘) obj = models.Token.objects.filter(token=token).first() if obj: # return obj.user.username, obj.token return obj.user, obj.token else: # raise exceptions.AuthenticationFailed(‘验证失败‘) return None # 不加这个方法会报错 def authenticate_header(self, request): pass
# 匿名用户和User都能访问 class HostView(viewsets.ModelViewSet): authentication_classes = [utils.Authentication] # 认证是匿名还是User,匿名用户在认证时返回None pagination_class = [] # 都能访问不需要加权限 def list(self, request, *args, **kwargs): print(request.data) return Response(‘我是匿名用户‘)
2、其它正常视图的权限便要加多一层处理,需要判断当前访问对象时User还是匿名用户
# 权限类 class PermissionCheck(object): message = "请登录" # 这里的request属于APIview重新构造的reuqest,经过认证后,认证组件返回一个request.user和request.auth, # 这两个的返回结果在自己的认证类中自定义返回的结果,所以这里能够直接调用 def has_permission(self, request, view): if request.user: # 如果是用户 继续走下一条权限 return True else: return False class PermissionCheckTwo(object): message = "你不是超级管理员" def has_permission(self, request, view): if request.user.role == 3: return True else: return False
class BookView(viewsets.ModelViewSet): authentication_classes = [utils.Authentication, ] permission_classes = [utils.PermissionCheck, utils.PermissionCheckTwo] # 加多一次权限验证 queryset = models.Book.objects.all() serializer_class = serializers.BookSerializers
也可以在settings中设置匿名用户:
REST_FRAMEWORK = { ‘UNAUTHENTICATED_USER‘: None, ‘UNAUTHENTICATED_TOKEN‘: None, }
标签:ram 必须 mes ons username war none ade 方法
原文地址:https://www.cnblogs.com/aizhinong/p/12549396.html