RestFul認(rèn)證 權(quán)限 節(jié)流 版本 解析器的使用

RestFul認(rèn)證

實(shí)現(xiàn)認(rèn)證需自定義類
源碼

APIView-dispatch-initial-self.perform_authentication-user()-self._authenticate-authenticate

1導(dǎo)入from rest_framework.authentication import BaseAuthentication
2 繼承BaseAuthentication
3重寫 authenticate方法

class MyorderAuthentication(BaseAuthentication):
"""
在這里實(shí)現(xiàn)認(rèn)證的邏輯

 
     def authenticate(self, request):
            token = request._request.GET.get('token')
            print(token)
            obj=UserToken.objects.filter(token=token).first()
            print(obj)
            # 獲取到token之后,需要在數(shù)據(jù)庫(kù)中查找token
            if not obj:
            # 沒(méi)有通過(guò)認(rèn)證
                    raise AuthenticationFailed('認(rèn)證失敗')
            # 返回元組( user,auth )
          return (obj.user,obj)
認(rèn)證分為局部認(rèn)證和全局認(rèn)證

局部認(rèn)證將自定義類寫在視圖中通中設(shè)置

 authentication_classes =[你需要認(rèn)證的類]
你也可以將authentication_classes =[]來(lái)取消認(rèn)證

全局認(rèn)證 自己創(chuàng)建一個(gè)文件夾 在文件夾下新創(chuàng) py文件將認(rèn)證類放在里面

在項(xiàng)目setting.py中添加

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': ['自定義認(rèn)證類的路徑'],}

RestFul權(quán)限

源碼

  APIView-dispatch-initial- self.check_permissions-has_permission()

實(shí)現(xiàn)權(quán)限需自定義類
導(dǎo)入from rest_framework.permissions import BasePermission
繼承 BasePermission
重寫has_permission方法

class MyOrderPermission(BasePermission):
"""自定義權(quán)限認(rèn)證的類,必須要實(shí)現(xiàn)has_permission方法"""
     message = '你不是超級(jí)用戶,沒(méi)有權(quán)限訪問(wèn)'
    def has_permission(self, request, view):
        用于判斷用戶身份
    """ user_type_choices = ((1, '普通用戶'), (2, 'VIP'), (3, 'SVIP'))
     Return `True` if permission is granted, `False` otherwise.
    返回True表示有權(quán)限訪問(wèn),返回False表示沒(méi)有權(quán)限訪問(wèn)
    """
          if request.user.user_type != 3:
                 return False
          return True

權(quán)限分為局部權(quán)限和全局權(quán)限

局部權(quán)限將自定義類寫在視圖中通中設(shè)置

 permission_classes  =[你需要權(quán)限的類]

同樣 你也可以將permission_classes =[]來(lái)取消權(quán)限
全局權(quán)限 自己創(chuàng)建一個(gè)文件夾 在文件夾下新創(chuàng) py文件將認(rèn)證類放在里面
在項(xiàng)目setting.py中添加

REST_FRAMEWORK = {
 'DEFAULT_PERMISSION_CLASSES'['unitls.permission.MyOrderPermission'], : ['自定義權(quán)限類的路徑'],}

RestFul節(jié)流

自定義節(jié)流類
導(dǎo)入from rest_framework.throttling import SimpleRateThrottle
繼承SimpleRateThrottle

class VisitThrottle(SimpleRateThrottle):
           #scope 是key用于獲取setting.py中的
        scope = 'logined'
    def get_cache_key(self, request, view):
    return request.user.username

局部設(shè)置與全局設(shè)置
局部設(shè)置 就是把節(jié)流類寫在視圖中

  通過(guò)設(shè)置throttle_classes =[節(jié)流類]

全局新建文件夾 在文件夾下新創(chuàng)py文件
通過(guò)設(shè)置

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_RATES':{
    'key':'value',
           },
    'DEFAULT_THROTTLE_CLASSES':['節(jié)流類路徑'],
}

RestFul版本

自定義類
導(dǎo)入from rest_framework.versioning import QueryParameterVersioning,URLPathVersioning
局部寫法

  versioning_class=自定義類或QueryParameterVersioning或URLPathVersioning

在setting.py中配置

REST_FRAMEWORK = {
      'VERSION_PARAM':'version',
      'DEFAULT_VERSION':'v1',#默認(rèn)版本
      'ALLOWED_VERSIONS':['v1','v2'],允許的版本
    }

全局的配置
在setting.py中配置

       REST_FRAMEWORK = {
        'VERSION_PARAM':'version',
          'DEFAULT_VERSION':'默認(rèn)版本',
        'ALLOWED_VERSIONS':['允許的版本'],
       'DEFAULT_VERSIONING_CLASS':版本自定義類路徑        }

RestFul解析器

導(dǎo)入FormParser,JSONParser
為開(kāi)發(fā)人員post請(qǐng)求上傳數(shù)據(jù)時(shí),傳遞的數(shù)據(jù)類型不同,我們可能在request._request.POST中獲取不到數(shù)據(jù)

case1: Content-Type : application/x-www-form-urlencoded

可以通過(guò)request._requ
case2:Content-Type:application/json
服務(wù)端接收到的post請(qǐng)求的數(shù)據(jù)格式就是json數(shù)據(jù): 在request._request.POST中就獲取不到數(shù)據(jù)
通過(guò)request.body獲取 """
import json
data = json.loads(request.body.decode('utf8'))
print(data)
"""

DRF內(nèi)置的解析器FormParser,JSONParser
使用(局部):
"""
   from rest_framework.parsers import FormParser,JSONParser
   class UserInfoView(APIView):
        parser_classes = [FormParser,JSONParser]
        #這時(shí)DRF 內(nèi)部代碼會(huì)根據(jù)request.Content-Type和解析器支持的media_type比較
        從而選擇對(duì)應(yīng)的解析器
        
        def post(self,request,*args,**kwargs):
            # 如果使用JSONParser、FormParser解析數(shù)據(jù)的話
            data = request.data
            print(data)
        
"""

使用(全局配置解析器):

在setting.py中配置

  REST_FRAMEWORK = {
  'DEFAULT_PARSER_CLASSES': ['rest_framework.parsers.FormParser,rest_framework.parsers.JSONParser']

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容