rest_framework-02-權限-內置權限源碼流程
阿新 • • 發佈:2018-07-08
應用 field nbsp 普通 定義 .py 默認 分享圖片 tail
權限
問題:不同視圖不同權限可以訪問
1.models.py
from django.db import models class UserInfo(models.Model): user_type_choices = ( (1,‘普通用戶‘), (2,‘VIP‘), (3,‘SVIP‘), ) user_type = models.IntegerField(choices=user_type_choices) # username = models.CharField(max_length=32)models.pyusername = models.CharField(max_length=32,unique=True) password = models.CharField(max_length=64) class UserToken(models.Model): user = models.OneToOneField(to=‘UserInfo‘) token = models.CharField(max_length=64)
2.用戶類型:
3.views.py:
假設訂單相關業務(只有SVIP用戶有權限)
假設用戶信息相關業務(只有普通用戶、VIP有權限)
4.運行結果:
基本使用
以上的權限代碼封裝到一個類中,以後各個視圖的get請求直接調用即可。不用每個類都寫一遍權限。
自定義權限類: 需要找到has_permission方法
0.看源碼:
1.
2.
3.復制源碼has_permission方法
4.繼續定義權限類:has_permission方法返回True表示有權訪問。
5.定義好了權限類,局部使用。
局部權限
6.運行結果:
7.再定義一個權限,出SVIP以外,其他用戶都能訪問。
8.將全權都放到另一個單獨的文件中。
然後視圖文件需要則引入。
views.py應用即可
代碼:
基本使用: class MyPermission(object): def has_permission(self,request,view): if request.user.user_type != 3: return False return True class OrderView(APIView): """ 訂單相關業務(只有SVIP用戶有權限) """ permission_classes = [MyPermission,] def get(self,request,*args,**kwargs): # request.user # request.auth self.dispatch ret = {‘code‘:1000,‘msg‘:None,‘data‘:None} try: ret[‘data‘] = ORDER_DICT except Exception as e: pass return JsonResponse(ret)權限代碼
permission.py from rest_framework.permissions import BasePermission # 權限 class SvipPermission(BasePermission): message = "必須是SVIP才能訪問" def has_permission(self,request,view): if request.user.user_type != 3: # SVIP return False # 無權訪問 return True # 有權訪問 class MyPermission1(BasePermission): def has_permission(self, request, view): if request.user.user_type == 3: # 普通用戶、VIP return False # 無權訪問 return True # 有權訪問 views.py from api.utils.permission import MyPermission1 from api.utils.throttle import VisitThrottle class OrderView(APIView): """ 訂單相關業務(只有SVIP用戶有權限) """ # 權限 # permission_classes = [SvipPermission,] def get(self, request, *args, **kwargs): # request.user # request.auth self.dispatch # if request.user.user_type != 3: # return HttpResponse(‘無權訪問‘) ret = {‘code‘:1000,‘msg‘:None,‘data‘:None} try: ret[‘data‘] = ORDER_DICT except Exception as e: pass return JsonResponse(ret) class UserInfoView(APIView): """ 用戶信息相關業務(只有普通用戶、VIP有權限) """ # 權限 寫了就不用全局的svip權限了。 permission_classes = [MyPermission1, ] def get(self, request, *args, **kwargs): # if request.user.user_type == 3: # return HttpResponse(‘無權訪問‘) return HttpResponse(‘用戶信息‘)View Code
以上的單視圖應用。全局使用怎麽辦呢?
全局權限
1.權限源碼流程:
2.
3.
4.
5.
6.
7.局部配置
8.permission.py
9.全局配置 settings.py
"DEFAULT_PERMISSION_CLASSES":[‘api.utils.permission.SvipPermission‘], # 權限
10.繼續看源碼:
11.每一個權限都有該方法 has_permission
12.如果返回Fasle,則執行報錯,拋出異常。
permission_denied
13.拋出異常
14.默認英文報錯
運行結果:
15.如何改成中文報錯信息呢?
運行結果:
內置權限
1.內置權限源碼流程
2.為了讓我們的權限更正規,必須繼承該內置權限。
代碼:
from rest_framework.permissions import BasePermission # 權限 class SvipPermission(BasePermission): message = "必須是SVIP才能訪問" def has_permission(self,request,view): if request.user.user_type != 3: # SVIP return False # 無權訪問 return True # 有權訪問 class MyPermission1(BasePermission): def has_permission(self, request, view): if request.user.user_type == 3: # 普通用戶、VIP return False # 無權訪問 return True # 有權訪問BasePermission 內置權限
梳理: 1. 使用 - 類,必須繼承:BasePermission,必須實現:has_permission方法 from rest_framework.permissions import BasePermission class SVIPPermission(BasePermission): message = "必須是SVIP才能訪問" def has_permission(self,request,view): if request.user.user_type != 3: return False return True - 返回值: - True, 有權訪問 - False,無權訪問 - 局部 class UserInfoView(APIView): """ 訂單相關業務(普通用戶、VIP) """ permission_classes = [MyPermission1, ] def get(self,request,*args,**kwargs): return HttpResponse(‘用戶信息‘) - 全局 REST_FRAMEWORK = { "DEFAULT_PERMISSION_CLASSES":[‘api.utils.permission.SVIPPermission‘] }
rest_framework-02-權限-內置權限源碼流程