DRF其它功能-認(rèn)證/權(quán)限/過濾/分頁(yè)

認(rèn)證Authentication

可以在配置文件中配置全局默認(rèn)的認(rèn)證方案
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication', # 基本認(rèn)證
'rest_framework.authentication.SessionAuthentication', # session認(rèn)證
)
}
也可以在每個(gè)視圖中通過設(shè)置authentication_classess屬性來設(shè)置
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView
class ExampleView(APIView):
authentication_classes = (SessionAuthentication, BasicAuthentication)
...
認(rèn)證失敗會(huì)有兩種可能的返回值:
401 Unauthorized 未認(rèn)證
403 Permission Denied 權(quán)限被禁止

權(quán)限Permissions

權(quán)限控制可以限制用戶對(duì)于視圖的訪問和對(duì)于具體數(shù)據(jù)對(duì)象的訪問侨艾。在執(zhí)行視圖的dispatch()方法前,會(huì)先進(jìn)行視圖訪問權(quán)限的判斷在通過get_object()獲取具體對(duì)象時(shí)拓挥,會(huì)進(jìn)行對(duì)象訪問權(quán)限的判斷
使用
可以在配置文件中設(shè)置默認(rèn)的權(quán)限管理類唠梨,如
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
如果未指明,則采用如下默認(rèn)配置

'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.AllowAny',
)
也可以在具體的視圖中通過permission_classes屬性來設(shè)置侥啤,如
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class ExampleView(APIView):
permission_classes = (IsAuthenticated,)
...
提供的權(quán)限
AllowAny 允許所有用戶
IsAuthenticated 僅通過認(rèn)證的用戶
IsAdminUser 僅管理員用戶
IsAuthenticatedOrReadOnly 認(rèn)證的用戶可以完全操作当叭,否則只能get讀取

自定義權(quán)限
如需自定義權(quán)限,需繼承rest_framework.permissions.BasePermission父類盖灸,并實(shí)現(xiàn)以下兩個(gè)任何一個(gè)方法或全部
.has_permission(self, request, view)是否可以訪問視圖蚁鳖, view表示當(dāng)前視圖對(duì)象
.has_object_permission(self, request, view, obj),是否可以訪問數(shù)據(jù)對(duì)象, view表示當(dāng)前視圖赁炎, obj為數(shù)據(jù)對(duì)象

限流Throttling

可以對(duì)接口訪問的頻次進(jìn)行限制醉箕,以減輕服務(wù)器壓力。
使用
可以在配置文件中,使用DEFAULT_THROTTLE_CLASSES 和 DEFAULT_THROTTLE_RATES進(jìn)行全局配置琅攘,
REST_FRAMEWORK = {
'DEFAULT_THROTTLE_CLASSES': (
'rest_framework.throttling.AnonRateThrottle',
'rest_framework.throttling.UserRateThrottle'
),
'DEFAULT_THROTTLE_RATES': {
'anon': '100/day',
'user': '1000/day'
}
}
DEFAULT_THROTTLE_RATES 可以使用 second, minute, hour 或day來指明周期垮庐。也可以在具體視圖中通過throttle_classess屬性來配置,如
from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView
class ExampleView(APIView):
throttle_classes = (UserRateThrottle,)
...
可選限流類
1) AnonRateThrottle
限制所有匿名未認(rèn)證用戶坞琴,使用IP區(qū)分用戶哨查。
使用DEFAULT_THROTTLE_RATES['anon'] 來設(shè)置頻次

2)UserRateThrottle
限制認(rèn)證用戶,使用User id 來區(qū)分剧辐。使用DEFAULT_THROTTLE_RATES['user'] 來設(shè)置頻次

3)ScopedRateThrottle
限制用戶對(duì)于每個(gè)視圖的訪問頻次寒亥,使用ip或user id。

過濾Filtering

對(duì)于列表數(shù)據(jù)可能需要根據(jù)字段進(jìn)行過濾荧关,我們可以通過添加django-fitlter擴(kuò)展來增強(qiáng)支持溉奕。
pip insall django-filter
在配置文件中增加過濾后端的設(shè)置:
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}
在視圖中添加filter_fields屬性,指定可以過濾的字段
class BookListView(ListAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
filter_fields = ('btitle', 'bread')
127.0.0.1:8000/books/?btitle=西游記

分頁(yè)P(yáng)agination

REST framework提供了分頁(yè)的支持忍啤。我們可以在配置文件中設(shè)置全局的分頁(yè)方式加勤,如:
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 100 # 每頁(yè)數(shù)目
}
也可通過自定義Pagination類,來為視圖添加不同分頁(yè)行為同波。在視圖中通過pagination_clas屬性來指明鳄梅。
class LargeResultsSetPagination(PageNumberPagination):
page_size = 1000
page_size_query_param = 'page_size'
max_page_size = 10000
class BookDetailView(RetrieveAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
pagination_class = LargeResultsSetPagination

可選分頁(yè)器
1) PageNumberPagination
前端訪問網(wǎng)址形式:
GET http://api.example.org/books/?page=4
可以在子類中定義的屬性:
page_size 每頁(yè)數(shù)目
page_query_param 前端發(fā)送的頁(yè)數(shù)關(guān)鍵字名,默認(rèn)為"page"
page_size_query_param 前端發(fā)送的每頁(yè)數(shù)目關(guān)鍵字名未檩,默認(rèn)為None
max_page_size 前端最多能設(shè)置的每頁(yè)數(shù)量
from rest_framework.pagination import PageNumberPagination
class StandardPageNumberPagination(PageNumberPagination):
page_size_query_param = 'page_size'
max_page_size = 10
class BookListView(ListAPIView):
queryset = BookInfo.objects.all().order_by('id')
serializer_class = BookInfoSerializer
pagination_class = StandardPageNumberPagination

127.0.0.1/books/?page=1&page_size=2

2)LimitOffsetPagination
前端訪問網(wǎng)址形式:
GET http://api.example.org/books/?limit=100&offset=400
可以在子類中定義的屬性:
default_limit 默認(rèn)限制戴尸,默認(rèn)值與PAGE_SIZE設(shè)置一直
limit_query_param limit參數(shù)名,默認(rèn)'limit'
offset_query_param offset參數(shù)名冤狡,默認(rèn)'offset'
max_limit 最大limit限制孙蒙,默認(rèn)None

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市悲雳,隨后出現(xiàn)的幾起案子挎峦,更是在濱河造成了極大的恐慌,老刑警劉巖怜奖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浑测,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡歪玲,警方通過查閱死者的電腦和手機(jī)迁央,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滥崩,“玉大人岖圈,你說我怎么就攤上這事「破ぃ” “怎么了蜂科?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵顽决,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我导匣,道長(zhǎng)才菠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任贡定,我火速辦了婚禮赋访,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缓待。我一直安慰自己蚓耽,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布旋炒。 她就那樣靜靜地躺著步悠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘫镇。 梳的紋絲不亂的頭發(fā)上鼎兽,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音汇四,去河邊找鬼接奈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛通孽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睁壁,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼背苦,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了潘明?” 一聲冷哼從身側(cè)響起行剂,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钳降,沒想到半個(gè)月后厚宰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遂填,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年铲觉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吓坚。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撵幽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出礁击,到底是詐尸還是另有隱情盐杂,我是刑警寧澤逗载,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站链烈,受9級(jí)特大地震影響厉斟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜强衡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一捏膨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧食侮,春花似錦号涯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至眉尸,卻和暖如春域蜗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背噪猾。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工霉祸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袱蜡。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓丝蹭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坪蚁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奔穿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 一、基本視圖類 (APIView/@api_view) 1敏晤、類基礎(chǔ)視圖(APIView) DRF不同于django...
    入間閱讀 3,751評(píng)論 0 3
  • 分頁(yè) REST framework 包含對(duì)可定制分頁(yè)樣式的支持贱田。這使你可以將較大的結(jié)果集分成單獨(dú)的數(shù)據(jù)頁(yè)面。分頁(yè) ...
    入間閱讀 1,312評(píng)論 0 2
  • 總結(jié)歷來解決的問題嘴脾,在土木工程科研技術(shù)領(lǐng)域男摧,MATLAB主要可以解決以下幾類問題: 數(shù)據(jù)統(tǒng)計(jì)與圖像化 實(shí)驗(yàn)數(shù)據(jù)擬合...
    馬騁閱讀 3,606評(píng)論 2 10
  • 子曰:“吾十有五而志于學(xué),三十而立译打,四十而不惑耗拓,五十而知天命,六十而耳順扶平,七十而從心所欲不逾矩帆离。”结澄,這句話是什么意...
    張錦全閱讀 490評(píng)論 0 0