16 权限
1. 权限源码分析
# APIView---->dispatch---->initial--->self.check_permissions(request)(APIView的对象方法) def check_permissions(self, request): # 遍历权限对象列表得到一个个权限对象(权限器),进行权限认证 for permission in self.get_permissions(): # 权限类一定有一个has_permission权限方法,用来做权限认证的 # 参数:权限对象self、请求对象request、视图类对象 # 返回值:有权限返回True,无权限返回False if not permission.has_permission(request, self): self.permission_denied( request, message=getattr(permission, 'message', None) )
1.2 权限的使用
# 普通用户,普通管理员,超级管理员 # 普通用户登录,可以操作book的所有接口,不能操作其他接口 # 普通管理员登录,可以操作book和publish的所有接口,不能操作其他的 # 超级管理员,可以操作所有接口 ### 权限如何使用 -第一步:写一个权限类,继承BasePermission,重写has_permission 方法 -第二步:在 重写has_permission 方法中判断用户是否有权限(request.user.user_type) -第三步:如果有权限,返回True,如果没有返回False -第四步:把写的权限类,配置在视图类中(跟请求和响应的配置一样),全局配置
##########写了两个权限类 from rest_framework.permissions import BasePermission # 给普通管理员写了一个权限类 class CommonAdminPermission(BasePermission): def has_permission(self, request, view): print(request.user) # 判断用户的权限 # request.user # 当前登录用户,因为权限类在认证类后执行,所以一旦认证通过,request.user就是当前登录用户 if request.user.user_type in [1, 2]: return True else: return False # 给超级管理员写权限类 class SuperAdminPermission(BasePermission): def has_permission(self, request, view): print(request.user) # 判断用户的权限 # request.user # 当前登录用户,因为权限类在认证类后执行,所以一旦认证通过,request.user就是当前登录用户 if request.user.user_type in [2]: return True else: return False #普通用户写权限类
# 写一个类,继承BasePermission,重写has_permission,如果权限通过,就返回True,不通过就返回False
from rest_framework.permissions import BasePermission
class UserPermission(BasePermission):
def has_permission(self, request, view):
# 不是超级用户,不能访问
# 由于认证已经过了,request内就有user对象了,当前登录用户
user=request.user # 当前登录用户
# 如果该字段用了choice,通过get_字段名_display()就能取出choice后面的中文
print(user.get_user_type_display())
if user.user_type==1:
return True
else:
return False
# 局部使用 class TestView(APIView): permission_classes = [app_auth.UserPermission] # 全局使用 REST_FRAMEWORK={ "DEFAULT_AUTHENTICATION_CLASSES":["app01.app_auth.MyAuthentication",], 'DEFAULT_PERMISSION_CLASSES': [ 'app01.app_auth.UserPermission', ], } # 局部禁用 class TestView(APIView): permission_classes = []
1.3 内置权限(了解)
# 演示一下内置权限的使用:IsAdminUser,控制是否对网站后台有权限的人 # 1 创建超级管理员 # 2 写一个测试视图类 from rest_framework.permissions import IsAdminUser from rest_framework.authentication import SessionAuthentication class TestView3(APIView): authentication_classes=[SessionAuthentication,] permission_classes = [IsAdminUser] def get(self,request,*args,**kwargs): return Response('这是22222222测试数据,超级管理员可以看') # 3 超级用户登录到admin,再访问test3就有权限 # 4 正常的话,普通管理员,没有权限看(判断的是is_staff字段)
补充
变量后直接加逗号
a=(3,) a=3, # a是元组 print(type(a))