rest_framework認證,權限,節(jié)流,版本,解析器總結

建立后端項目,model模型,view視圖,url路由配置

這里對應的就是我們寫的model模型user用戶和token信息表

一,認證組件

(1)?? 設置認證,只有通過的用戶才能訪問指定的url地址

(2)?? 寫認證的類父元素是APIview,rest_framework源碼dispatch里面調用了封裝之后的request,調用initial方法里面調用了perform_authentication方法,返回的是user/auth倆值,我們寫認證則要重新定義perform_authentication,根據(jù)token來匹配數(shù)據(jù)庫做判斷返回相對應的返回.

(3)寫好之后需要在setting文件中配置

這里鍵是根據(jù)APIview下方設置的中間件來定義的

???????????? api_settings.DEFAULT_AUTHENTICATION_CLASSES

???????????? REST_FRAMEWORK = {

'DEFAULT_AUTHENTICATION_CLASSES'['unitls.authentication.MyOrderAuthentication'],

???????????? }

(這里設置的是全局認證),如果是局部認證只需要在view中需要認證的地方寫入

??????????? authentication_classes = [這里是自己定義的認證類]

**注意的是如果開啟全局認證用戶登錄前需要關閉認證則要寫入**

???????????? authentication_classes = []

注冊成功之后要存數(shù)據(jù)庫,用來后面登錄做匹配

??????????????? username = request._request.POST.get('username')

??????????????? password = request._request.POST.get('password')

? 這里為們要用md5加碼生成token然后保存

????????????? token = md5(username,password)

????????????? # 將token保存

??????????????? UserToken.objects.update_or_create(

??????????????? user=obj,defaults={'token':token},

????????????????? )

保存后面登錄根據(jù) 生成的token來做匹配判斷



二,權限

(1)?? 給用戶設置權限,只有登錄用戶并且是指定用戶才能訪問

(2)?? 和認證方法大致相同在initial方法下調用

self.check_permissions(request),進入到check_permissions函數(shù)中發(fā)現(xiàn)里面是做一個對象循環(huán)判斷

????????????? if not permission.has_permission(request, self):

#在自定義的Permission中has_permission方法是必須要有的

#判斷當前has_permission返回的是True扮休,F(xiàn)alse蒸辆,還是拋出異常

#如果是True則表示權限通過,False執(zhí)行下面代碼

#為False的話則拋出異常埠胖,當然這個異常返回的提示信息是英文的,如果我們想讓他顯示我們自定義的提示信息

#我們重寫permission_denied方法即可

???????????? self.permission_denied(

#從自定義的Permission類中獲取message(權限錯誤提示信息),一般自定義的話都建議寫上,如果沒有則為默認的(英文提示)

??????????????? self.permission_denied(

?????????????? request,message=getattr(permission,'message',None)

??????????????? )

只需要更改message值就行比如

message ='你不是超級用戶族购,沒有權限訪問'

(---------)例如我在下面寫了一個判斷3表示的是svip用戶

??????????? def has_permission(self, request, view):

"""

????????????????????? Return `True` if permission is granted, `False` otherwise.

? ? 返回True表示有權限訪問,返回False表示沒有權限訪問"""

? ???????????????????? if request.user.user_type !=3:

?????????????????????????????? return False

? ? ? ? ? ? ? ? ? ? ? ? return True

******全局配置

REST_FRAMEWORK = {

"DEFAULT_PERMISSION_CLASSES":[自己寫權限類的路徑]

}


三,節(jié)流

有些時候為了對用戶的訪問頻率進行限制和防止爬蟲抵拘,需要在規(guī)定的時間中對用戶訪問的次數(shù)進行限制

(1),源碼入口dispatch--------->>執(zhí)行認證? self.initial ------->>頻率控制self.check_throttles(request)里面做循環(huán)判斷,

for? throttlein self.get_throttles():

? ? ? if? not throttle.allow_request(request, self):

? ? ? ? ? ? ? ? self.throttled(request, throttle.wait())

如果沒有通過會返回 false 執(zhí)行 self.throttled(request, throttle.wait()),拋出異常---------返回True表示可以繼續(xù)訪問

def get_throttles(self):

?????????? # 返回訪問頻率控制的

????????? return[throttle()? for??? throttle?? in??? self.throttle_classes]--------------->>

所以說我們需要進行節(jié)流限制接口設置類屬性

throttle_class = [ 節(jié)流限制的類 ]

我們需要重寫allow_request(request, self) 和 wait 方法

**全局設置

REST_FRAMEWORK = {

"DEFAULT_THROTTLE_CLASSES":{

'unlogin':'10/m',

?'logined':'3/m'

}

這里的unlogin和logined是我們在節(jié)流類下面寫入----->>類:scope ='logined'

四,版本

1,類:在新版本上線,老版本不能直接刪除情況下哎榴,用到版本控制

2,? 進口dispatch ---->>initial下面有版本控制源碼

version, scheme =self.determine_version(request, *args, **kwargs)

request.version, request.versioning_scheme = version, scheme

3,這里調用方法self.determine_version,進入看到

def determine_version(self, request, *args, **kwargs):

?????? if self.versioning_classis None:

???????????????? return (None,None)

????? scheme =self.versioning_class()

?????? return (scheme.determine_version(request, *args, **kwargs), scheme)

(1)versioning_classis是在setting中定義的版本控制類

(2)versioning_class()進行定義的版本控制類實例化賦值給了scheme

(3) 最后return中 執(zhí)行版本控制類中的determine_version方法,返回version,

4,scheme.determine_version的執(zhí)行取決與我們所引用的版本控制類是哪一個,我們一般都用URLPathVersioning和QueryParameterVersioning

導入后點進入URLPathVersioning,里面發(fā)現(xiàn)調用is_allowed_version方法,這里做判斷是否能訪問當前版本

return((version? is? not? None? and? version == self.default_version) or

(version in self.allowed_versions))

到這我們就獲取到訪問版本的類,回到開始-------------------------------

version, scheme = self.determine_version(request, *args, **kwargs)

request.version, request.versioning_scheme = version, scheme

我們將version 和scheme封裝在request中如果我們訪問的版本符合要求我們可以通過調用

request.version, request.versioning_scheme 來獲得版本號和控制版本的類


5,自己定義版本類模塊,定義函數(shù)determine_version做版本控制配置路由要改變,,,,類:

url(r"^(?P<version>[v1|v2]+)/userinfo/", UserInfoView.as_view(),name='vvvv')

6,全局設置

'DEFAULT_THROTTLE_CLASSES':['unitls.throll.VisitThrottle'],

#設置版本的參數(shù)

'VERSION_PARAM':'version',

'DEFAULT_VERSION':'v1',

'ALLOWED_VERSIONS':['v1','v2'],

五,解析器

1,解析器是對我們請求體中的數(shù)據(jù)進行反序列化僵蛛、封裝 把我們的所有的請求數(shù)據(jù)都封裝在request.data中 在request.data中獲取數(shù)據(jù)

2,使用

(1)獲取用戶請求

(1)獲取用戶請求體

(3)根據(jù)用戶請求頭信息和parase_classes=[...],中的請求頭進行比較尚蝌,匹配上請求頭就使用該解析器處理

(4)解析器從請求體中拿數(shù)據(jù)進行處理,處理完成之后將結果返回給request.data

-------------------------------------------------------------------

要導入模塊

from rest_framework.parsers?? import FormParser,? JSONParser

添加局部認證

parser_classes = [FormParser, JSONParser]

(1)然后獲取數(shù)據(jù),正常的post請求

瀏覽器中media_type形式為

media_type ='application/x-www-form-urlencoded'

(2)如果這里發(fā)送的是json數(shù)據(jù)則返回null空取不到數(shù)據(jù)

我們就可以在request的data中獲取數(shù)據(jù)data = request.data

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末充尉,一起剝皮案震驚了整個濱河市飘言,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驼侠,老刑警劉巖姿鸿,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泵喘,死亡現(xiàn)場離奇詭異,居然都是意外死亡般妙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門相速,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碟渺,“玉大人,你說我怎么就攤上這事突诬∩慌模” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵旺隙,是天一觀的道長绒极。 經(jīng)常有香客問我,道長蔬捷,這世上最難降的妖魔是什么垄提? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮周拐,結果婚禮上铡俐,老公的妹妹穿的比我還像新娘。我一直安慰自己妥粟,他們只是感情好审丘,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著勾给,像睡著了一般滩报。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上播急,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天脓钾,我揣著相機與錄音,去河邊找鬼桩警。 笑死惭笑,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的生真。 我是一名探鬼主播沉噩,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼柱蟀!你這毒婦竟也來了川蒙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤长已,失蹤者是張志新(化名)和其女友劉穎畜眨,沒想到半個月后昼牛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡康聂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年贰健,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恬汁。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡伶椿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氓侧,到底是詐尸還是另有隱情脊另,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布约巷,位于F島的核電站偎痛,受9級特大地震影響,放射性物質發(fā)生泄漏独郎。R本人自食惡果不足惜踩麦,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望氓癌。 院中可真熱鬧靖榕,春花似錦、人聲如沸顽铸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谓松。三九已至星压,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鬼譬,已是汗流浹背娜膘。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留优质,地道東北人竣贪。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像巩螃,于是被迫代替她去往敵國和親演怎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容