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']
}