还是通过源码进行查看
dispatch
-----> self.initial(request, *args, **kwargs)
-----> 查看initial方法
----> self.check_permissions(request)
----> 查看check_permission()方法
---->
def check_permissions(self, request):
"""
Check if the request should be permitted.
Raises an appropriate exception if the request is not permitted.
"""
for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)
和之前的用户认证一毛一样,这个静态列表可以局部配置,也可以全局配置,调用了权限认证类的has_permission方法,然后返回了权限类中的属性message反射的方式
。
- 我们在utils包中创建权限认证类,重写has_permission方法,定义message静态字段,函数返回true或者false。
- 然后看怎么在全局中配置,也就是找到他的键,查看
get_permission
,找到了permission_classes = api_settings.DEFAULT_PERMISSION_CLASSES
,所以我们在settings中定义的REST_FRAMEWORK中,添加新的键值对,键为DEFAULT_PERMISSION_CLASSES
,值为utils包中权限认证类的路径。
权限认证类也有内置的类,
from restframework.permissions import Basepermission
,自定义的权限认证类继承这个类。
代码实现
utils.permission.py.Mypermission 权限类
from rest_framework.permissions import BasePermission
class Mypermission(BasePermission):
'''用户权限类'''
def has_permission(self, request, view):
if request.user.user_type != 'SVIP': # 具体权限逻辑
return False
return True
views.py 视图函数
from utils.permission import Mypermission
class OrderView(APIView):
# authentication_classes = [Authentication,] # 局部引用
permission_classes = [Mypermission,]
def get(self,request):
ret = {'code':10000,'msg':None}
try:
pass # 具体视图函数逻辑
except Exception as e:
pass # 抛出异常
return JsonResponse(ret)
settings全局使用
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES':['app1.utils.permission.Myspermission'],
}
网友评论