一乖菱、Authentication:認(rèn)證
可在配置文件中設(shè)置全局認(rèn)證或類視圖中局部定義坡锡。通常默認(rèn)使用的是SessionAuthentication
,BasicAuthentication
兩種認(rèn)證,
- 全局設(shè)置
在settings配置文件中:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication', # 基本認(rèn)證
'rest_framework.authentication.SessionAuthentication', # session認(rèn)證
)
}
- 類視圖局部設(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ì)這么操作,而是指定視圖類來限制捺氢。
- 全局設(shè)置
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
)
}
- 類視圖局部設(shè)置:
使用permission_classes
屬性來設(shè)置
只能在繼承于APIView的類及其擴(kuò)展類的視圖類中使用
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
class ExampleView(APIView):
permission_classes = (IsAuthenticated,)
...
- 提供的常用權(quán)限
權(quán)限 | 功能 |
---|---|
AllowAny | 允許所有用戶 |
IsAuthenticated | 僅通過認(rèn)證的用戶 |
IsAdminUser | 僅管理員用戶 |
IsAuthenticatedOrReadOnly | 認(rèn)證的用戶可以完全操作藻丢,未通過認(rèn)證的用戶只能讀取操作 |
也可以通過重寫B(tài)asePermission自定義權(quán)限。
三摄乒、Throttling:限流
可設(shè)置限制對接口的訪問頻次悠反,防止惡意高頻訪問残黑,降低服務(wù)器的壓力。
- 全局設(shè)置
可以在配置文件中问慎,使用DEFAULT_THROTTLE_CLASSES
和 DEFAULT_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'
}
}
- 局部設(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,)
...
- 限流類功能及頻率設(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)行解析和過濾匀钧。
- 安裝
django-filter
包
pip insall django-filter
- 配置過濾器
在配置文件中添加:
# 注冊應(yīng)用
INSTALLED_APPS = [
...
'django_filters',
]
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': (
'django_filters.rest_framework.DjangoFilterBackend',
),
}
- 指定過濾字段
需要注意的是,過濾功能只能在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過濾器相同的是檀何,它也只能在繼承了ListAPIView
或ListModelMixin
的視圖類中使用。
同時(shí)廷支,在一個(gè)視圖類中频鉴,F(xiàn)iltering與OrderingFilter只能二選一使用。
- 配置過濾器
在Filtering配置時(shí)已經(jīng)完成配置文件配置恋拍。 - 使用方法
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分頁
- 全局設(shè)置
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
'PAGE_SIZE': 100 # 每頁數(shù)目
}
- 局部設(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
- 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基本相似
- 全局設(shè)置
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 100 # 每頁數(shù)目
}
- 局部設(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
- 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,
......
})