DjangoRest framework-認(rèn)證际度、權(quán)限葵袭、限流、分頁等配置功能總結(jié)

一乖菱、Authentication:認(rèn)證

可在配置文件中設(shè)置全局認(rèn)證或類視圖中局部定義坡锡。通常默認(rèn)使用的是SessionAuthentication,BasicAuthentication兩種認(rèn)證,

  1. 全局設(shè)置

在settings配置文件中:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',   # 基本認(rèn)證
        'rest_framework.authentication.SessionAuthentication',  # session認(rèn)證
    )
}
  1. 類視圖局部設(shè)置:
    使用authentication_classes屬性來設(shè)置
    只能在繼承于APIView的類及其擴(kuò)展類的視圖類中使用
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from rest_framework.views import APIView

class ExampleView(APIView):
    authentication_classes = (SessionAuthentication, BasicAuthentication)
    ...

注意:Authentication身份驗(yàn)證本身并不會(huì)禁止傳入請求窒所,它只是標(biāo)識(shí)請求所使用的憑據(jù)鹉勒,需要配合權(quán)限認(rèn)證Permissions一起使用才有限制作用。

二吵取、Permissions:權(quán)限

權(quán)限控制可以限制用戶對于視圖的訪問和對于具體數(shù)據(jù)對象的訪問禽额。

  • 在執(zhí)行視圖的dispatch()方法前,會(huì)先進(jìn)行視圖訪問權(quán)限的判斷
  • 在通過get_object()獲取具體對象時(shí)皮官,會(huì)進(jìn)行對象訪問權(quán)限的判斷

可以進(jìn)行全局設(shè)置脯倒,不過一般不會(huì)這么操作,而是指定視圖類來限制捺氢。

  1. 全局設(shè)置
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}
  1. 類視圖局部設(shè)置:
    使用permission_classes屬性來設(shè)置
    只能在繼承于APIView的類及其擴(kuò)展類的視圖類中使用
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView

class ExampleView(APIView):
    permission_classes = (IsAuthenticated,)
    ...
  1. 提供的常用權(quán)限
權(quán)限 功能
AllowAny 允許所有用戶
IsAuthenticated 僅通過認(rèn)證的用戶
IsAdminUser 僅管理員用戶
IsAuthenticatedOrReadOnly 認(rèn)證的用戶可以完全操作藻丢,未通過認(rèn)證的用戶只能讀取操作

也可以通過重寫B(tài)asePermission自定義權(quán)限。

三摄乒、Throttling:限流

可設(shè)置限制對接口的訪問頻次悠反,防止惡意高頻訪問残黑,降低服務(wù)器的壓力。

  1. 全局設(shè)置

可以在配置文件中问慎,使用DEFAULT_THROTTLE_CLASSESDEFAULT_THROTTLE_RATES設(shè)置限流類型萍摊、訪問頻次進(jìn)行全局配置。

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    }
}
  1. 局部設(shè)置

在類視圖中指定throttle_classes屬性如叼,設(shè)置限流對象冰木,而具體的對應(yīng)的限制頻次仍在settings中進(jìn)行全局配置。

from rest_framework.throttling import UserRateThrottle
from rest_framework.views import APIView

class ExampleView(APIView):
    throttle_classes = (UserRateThrottle,)
    ...
  1. 限流類功能及頻率設(shè)定方法
限流類名 限制對象 限定頻次設(shè)置
AnonRateThrottle 限制所有匿名未認(rèn)證用戶笼恰,使用IP區(qū)分用戶 anon
UserRateThrottle 限制認(rèn)證用戶踊沸,使用User id 來區(qū)分 user
ScopedRateThrottle 限制用戶對于每個(gè)視圖的訪問頻次,使用ip或user id 必須先在視圖類中設(shè)定屬性throttle_scope = 限制名
  • 使用 ScopedRateThrottle示例:
    現(xiàn)在視圖類中定義throttle_scope屬性社证,則速率限定的字段為設(shè)置的屬性逼龟。
class ContactDetailView(APIView):
    throttle_scope = 'contacts'
    ...

class UploadView(APIView):
    throttle_scope = 'uploads'
    ...

DEFAULT_THROTTLE_RATES使用上述定義的屬性字段。

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.ScopedRateThrottle',
    ),
    'DEFAULT_THROTTLE_RATES': {
        'contacts': '1000/day',
        'uploads': '20/day'
    }
}

四追葡、Filtering:過濾

對于列表數(shù)據(jù)可能需要根據(jù)字段進(jìn)行過濾腺律,我們可以通過添加django-fitlter擴(kuò)展來增強(qiáng)支持。
使用Filtering可實(shí)現(xiàn)對請求url中宜肉?后的查詢字符串參數(shù)進(jìn)行解析和過濾匀钧。

  1. 安裝django-filter
pip insall django-filter
  1. 配置過濾器

在配置文件中添加:

# 注冊應(yīng)用
INSTALLED_APPS = [
    ...
    'django_filters',  
]


REST_FRAMEWORK = {
     'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
    ),
}

  1. 指定過濾字段

需要注意的是,過濾功能只能在ListAPIView谬返、ListModelMixin中使用之斯,也就是說只能用在獲取全部數(shù)據(jù)的操作中。
在類視圖中添加filter_fields屬性遣铝,指定可以過濾的字段

class BookListView(ListAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    filter_fields = ('btitle', 'bread')

請求URL路徑示例:

127.0.0.1:8000/books/?btitle=天龍八部
# 返回所有圖書中標(biāo)題為"天龍八部"的數(shù)據(jù)

在該視圖類中定義的filter_fields = ('btitle', 'bread')指過濾的字段指定為元祖中包括的兩個(gè)字段佑刷,及前端訪問的URL中,只匹配btitle酿炸、 bread兩個(gè)查詢字符串內(nèi)容并返回瘫絮。

五、OrderingFilter:排序過濾

OrderingFilter是帶有排序功能的過濾器填硕,和Filtering過濾器相同的是檀何,它也只能在繼承了ListAPIViewListModelMixin的視圖類中使用。
同時(shí)廷支,在一個(gè)視圖類中频鉴,F(xiàn)iltering與OrderingFilter只能二選一使用。

  1. 配置過濾器
    在Filtering配置時(shí)已經(jīng)完成配置文件配置恋拍。
  2. 使用方法
    REST framework會(huì)在請求的查詢字符串參數(shù)中檢查是否包含了ordering參數(shù)垛孔,如果包含了ordering參數(shù),則按照ordering參數(shù)指明的排序字段對數(shù)據(jù)集進(jìn)行排序施敢。
  • ordering_fields包含內(nèi)容為前端可以傳遞的ordering參數(shù)周荐。
  • ordering指定按該字段進(jìn)行默認(rèn)排序(當(dāng)前端未傳遞ordering參數(shù)時(shí))
class BookListView(ListAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    # filter_backends指定使用OrderingFilter還是Filtering狭莱,二者只能同時(shí)用其一
    filter_backends = [OrderingFilter]
    # 指定允許前端傳遞的查詢字符串ording字段   
    ordering_fields = ('id', 'bread', 'bpub_date')
    # 指定默認(rèn)的排序字段
    ordering = ("id")

請求URL路徑示例:

127.0.0.1:8000/books/?ordering=-bread
# 返回所有圖書并按閱讀量降序排序

還可指定多字段排序:

127.0.0.1:8000/books/?ordering=-bread,-bpub_data
# 先按閱讀量降序排序概作,閱讀量相同的則按發(fā)布時(shí)間降序排序腋妙。

六、Pagination:分頁

(一)使用PageNumberPagination分頁

  1. 全局設(shè)置
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS':  'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 100  # 每頁數(shù)目
}
  1. 局部設(shè)置
    通過繼承并自定義PageNumberPagination類讯榕,為視圖添加不同分頁行為骤素。
class LargeResultsSetPagination(PageNumberPagination):
    # 每頁最大顯示數(shù)量
    page_size = 1000
    # 指定前端查詢第幾頁的關(guān)鍵字
    page_query_param = 'page'
    # 指定前端控制每頁顯示數(shù)量的關(guān)鍵字,默認(rèn)為None不可控制
    page_size_query_param = 'page_size'
    # 每頁最大顯示數(shù)量限制愚屁,僅在設(shè)置了page_size_query_param時(shí)有效
    max_page_size = 10000

然后在類視圖下通過pagination_class屬性來指明該類視圖下的分頁設(shè)置济竹。

class BookDetailView(ListAPIView):
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer
    # 指明使用的pagination_class分頁類
    pagination_class = LargeResultsSetPagination

若需在視圖內(nèi)關(guān)閉分頁功能,只需如下設(shè)置:

pagination_class = None
  1. PageNumberPagination類可定義屬性
  • page_size :每頁數(shù)目
  • page_query_param :前端發(fā)送的頁數(shù)關(guān)鍵字名霎槐,默認(rèn)為"page"
  • page_size_query_param :前端發(fā)送的每頁數(shù)目關(guān)鍵字名送浊,默認(rèn)為None
  • max_page_size :前端最多能設(shè)置的每頁數(shù)量

前端請求示例:請求第一頁,每頁顯示數(shù)量為2丘跌。

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

(二)使用LimitOffsetPagination分頁

與PageNumberPagination基本相似

  1. 全局設(shè)置
REST_FRAMEWORK = {
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 100  # 每頁數(shù)目
}
  1. 局部設(shè)置
    繼承LimitOffsetPagination類并自定義分頁規(guī)則,或直接導(dǎo)入該類使用其默認(rèn)設(shè)置袭景。

使用默認(rèn)設(shè)置示例:

from rest_framework.pagination import LimitOffsetPagination

class BookListView(ListAPIView):
    queryset = BookInfo.objects.all().order_by('id')
    serializer_class = BookInfoSerializer
    pagination_class = LimitOffsetPagination
  1. LimitOffsetPagination類可定義屬性
  • 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

前端請求示例:查詢偏移量3蔼啦,限制長度為2的頁面數(shù)據(jù)

127.0.0.1:8000/books/?offset=3&limit=2

自定義分頁數(shù)據(jù)返回格式

在定義的分頁器類中,重寫get_paginated_response方法

class PageNum(PageNumberPagination):
    # 每頁最大顯示數(shù)量
    page_size = 20
    # 指定前端查詢第幾頁的關(guān)鍵字
    page_query_param = 'page'
    # 指定前端控制每頁顯示數(shù)量的關(guān)鍵字仰猖,默認(rèn)為None不可控制
    page_size_query_param = 'page_size'
    # 每頁最大顯示數(shù)量限制捏肢,僅在設(shè)置了page_size_query_param時(shí)有效
    max_page_size = 10000
    
#重寫該方法,自定義返回結(jié)果格式
    def get_paginated_response(self,data):
        retrun Response({
            'count':XXX,
            'result':XXX,
            ......
        })
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末饥侵,一起剝皮案震驚了整個(gè)濱河市鸵赫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躏升,老刑警劉巖辩棒,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異膨疏,居然都是意外死亡一睁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門佃却,熙熙樓的掌柜王于貴愁眉苦臉地迎上來者吁,“玉大人,你說我怎么就攤上這事饲帅「吹剩” “怎么了瘤泪?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長育八。 經(jīng)常有香客問我对途,道長,這世上最難降的妖魔是什么髓棋? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任实檀,我火速辦了婚禮,結(jié)果婚禮上仲锄,老公的妹妹穿的比我還像新娘劲妙。我一直安慰自己,他們只是感情好儒喊,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布镣奋。 她就那樣靜靜地躺著,像睡著了一般怀愧。 火紅的嫁衣襯著肌膚如雪侨颈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天芯义,我揣著相機(jī)與錄音哈垢,去河邊找鬼。 笑死扛拨,一個(gè)胖子當(dāng)著我的面吹牛耘分,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绑警,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼求泰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了计盒?” 一聲冷哼從身側(cè)響起渴频,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎北启,沒想到半個(gè)月后卜朗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咕村,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年场钉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懈涛。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惹悄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出肩钠,到底是詐尸還是另有隱情泣港,我是刑警寧澤暂殖,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站当纱,受9級特大地震影響呛每,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坡氯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一晨横、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箫柳,春花似錦手形、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涮毫,卻和暖如春瞬欧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罢防。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工艘虎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咒吐。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓野建,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恬叹。 傳聞我的和親對象是個(gè)殘疾皇子候生,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

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