Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(二)
解析器介紹:
所謂解析器,就是前端傳過(guò)來(lái)的數(shù)據(jù),后端可以解析,從request.data中取出來(lái),默認(rèn)的解析器配置是三種編碼格式都可以取
回到頂部
解析器的作用:
根據(jù)請(qǐng)求頭(content-type)選擇對(duì)應(yīng)的解析器對(duì)請(qǐng)求體內(nèi)容進(jìn)行處理,有application/json,x-www-form-urlencoded,form-data等格式
設(shè)置解析器就可以控制前端傳過(guò)來(lái)的數(shù)據(jù)類型進(jìn)行限制,比如說(shuō)我只能解析json格式的數(shù)據(jù),那么前端必須給我傳json數(shù)據(jù)我才能拿到
三種編碼格式:urlencoded,formdata,json
-urlencoded:在body體中的格式是:name=xxx&age=18&wife=liyitong
-formdata:在body體中的格式數(shù)據(jù)部分跟文件部分有區(qū)分
-json格式:在body體中就是json格式
解析器的使用:
(實(shí)際就是通過(guò)配置解析器,讓后端只接收某一種格式的請(qǐng)求數(shù)據(jù)類型,這樣后端只能解析該類型數(shù)據(jù),其它類型的請(qǐng)求都會(huì)無(wú)效,當(dāng)然設(shè)置一種也可以設(shè)置多種)
局部使用:
測(cè)試:
全局使用:
先了解一下默認(rèn)解析三種格式的設(shè)置代碼:
全局設(shè)置:
三、響應(yīng)器:
回到頂部
響應(yīng)器的作用:
根據(jù)用戶請(qǐng)求URL 或 用戶可接受的類型,篩選出合適的 渲染組件。
回到頂部
響應(yīng)器的使用:
響應(yīng)器的內(nèi)置渲染器:
顯示json格式:JSONRenderer
默認(rèn)顯示格式:BrowsableAPIRenderer(可以修改它的html文件)
訪問(wèn)URL:http://127.0.0.1:8000/test/?format=api http://127.0.0.1:8000/test.api http://127.0.0.1:8000/test/表格方式:AdminRenderer
訪問(wèn)URL:http://127.0.0.1:8000/test/?format=adminhttp://127.0.0.1:8000/test.adminhttp://127.0.0.1:8000/test/form表單方式:HTMLFormRenderer
訪問(wèn)URL:http://127.0.0.1:8000/test/?format=formhttp://127.0.0.1:8000/test.formhttp://127.0.0.1:8000/test/四、版本控制
restful規(guī)范里,提出過(guò)版本的概念,也就是說(shuō)版本控制就是相對(duì)于接口而言,它有多個(gè)版本,就好像應(yīng)用程序、手機(jī)app都會(huì)更新版本一樣,會(huì)修改更新接口文件,這時(shí)候就不能在原接口進(jìn)行修改更新,應(yīng)該另起一個(gè)接口作為版本2(假設(shè)為v2)來(lái)提供給用戶使用,原來(lái)的版本可能是v1,那么v1和v2版本提供給外界的控制,就是版本控制。
通過(guò)路由拼接版本號(hào)或者放入請(qǐng)求頭中的途徑來(lái)獲取對(duì)應(yīng)版本號(hào)的接口,進(jìn)行請(qǐng)求。
from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning#基于url的get傳參方式:QueryParameterVersioning------>如:/users?version=v1 #基于url的正則方式:URLPathVersioning------>/v1/users/ #基于 accept 請(qǐng)求頭方式:AcceptHeaderVersioning------>Accept: application/json; version=1.0 #基于主機(jī)名方法:HostNameVersioning------>v1.example.com #基于django路由系統(tǒng)的namespace:NamespaceVersioning------>example.com/v1/users/全局使用:
-在setting中配置: 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning','DEFAULT_VERSION': 'v1', # 默認(rèn)版本(從request對(duì)象里取不到,顯示的默認(rèn)值)'ALLOWED_VERSIONS': ['v1', 'v2'], # 允許的版本'VERSION_PARAM': 'version' # URL中獲取值的key -路由需要修改-url(r'^(?P<version>[v1|v2]+)/test/', views.Test.as_view()),
局部使用:
在視圖類中就可以通過(guò):request.version取出當(dāng)前訪問(wèn)哪個(gè)版本,相應(yīng)的取執(zhí)行相應(yīng)版本的代碼
回到頂部
五、DRF分頁(yè)器
前戲:批量創(chuàng)建多條數(shù)據(jù)用于測(cè)試分頁(yè):
url(r'^pagetest/', views.PaginationTest.as_view()), # views.pyclass PaginationTest(APIView):# 批量創(chuàng)建publish記錄,用于測(cè)試分頁(yè)def post(self,request):pub_l = []for i in range(1000):pub_l.append(models.Publish(name='出版社[%s]' % (i+1), addr='地址[%s]' % (i+1)))models.Publish.objects.bulk_create(pub_l)return Response('批量創(chuàng)建成功')常規(guī)分頁(yè)
url(r’^pagetest/’, views.PaginationTest.as_view()),
# 視圖類from rest_framework.pagination import PageNumberPagination,LimitOffsetPagination,CursorPagination from app01.MySer import PublishSerclass PaginationTest(APIView):# 批量創(chuàng)建publish記錄,用于測(cè)試分頁(yè)def post(self,request):pub_l = []for i in range(1000):pub_l.append(models.Publish(name='出版社[%s]' % (i+1), addr='地址[%s]' % (i+1)))models.Publish.objects.bulk_create(pub_l)return Response('批量創(chuàng)建成功')def get(self, request, *args, **kwargs):# 拿到所有數(shù)據(jù)publish_list = models.Publish.objects.all()# 實(shí)例化出page對(duì)象page = PageNumberPagination() # ================ page相關(guān)參數(shù)配置開(kāi)始 ================ ## # 每頁(yè)顯示10條,也可以在settings.py中添加全局配置('PAGE_SIZE': 10 )page.page_size = 10# # 設(shè)置每頁(yè)條數(shù)的拼接key(默認(rèn)為size)page.page_size_query_param = 'size0'# # 控制每頁(yè)最大顯示條數(shù):(這個(gè)控制僅限制于路徑后拼接設(shè)置size0=1000后,對(duì)其進(jìn)行限制)page.max_page_size = 30# # 設(shè)置定位的頁(yè)數(shù)的拼接key(默認(rèn)是page)page.page_query_param = 'page0' # ================ page相關(guān)參數(shù)配置結(jié)束 ================ ## 對(duì)數(shù)據(jù)進(jìn)行分頁(yè)處理:ret_page = page.paginate_queryset(publish_list, request, self)# 序列化pub_ser = PublishSer(instance=ret_page, many=True)return Response(pub_ser.data)也可以在全局配置每頁(yè)顯示條數(shù):
測(cè)試:
偏移分頁(yè)
偏移分頁(yè)與普通分頁(yè)使用基本相同,類不同,配置的參數(shù)名稱不同
# 偏移分頁(yè):def get(self, request, *args, **kwargs):# 拿到所有數(shù)據(jù)publish_list = models.Publish.objects.all()# 實(shí)例化出page對(duì)象page = LimitOffsetPagination() # ================ page相關(guān)參數(shù)進(jìn)行配置開(kāi)始 ================ ## # 從標(biāo)桿位置往后取幾個(gè),比如指定取10個(gè)page.default_limit = 10# # 拼接key值自定義# 拿幾條記錄的key值自定義page.limit_query_param = 'limit0'# 標(biāo)桿值(起始位置),從設(shè)置的offset0值那個(gè)位置往后拿limit0值的記錄page.offset_query_param = 'offset0'# # 設(shè)置最大取10條page.max_limit = 20 # ================ page相關(guān)參數(shù)進(jìn)行配置結(jié)束 ================ ## 對(duì)數(shù)據(jù)進(jìn)行分頁(yè)處理:ret_page = page.paginate_queryset(publish_list, request, self)# 序列化pub_ser = PublishSer(instance=ret_page, many=True)return Response(pub_ser.data)補(bǔ)充:get_paginated_response的使用
將return Response(pub_ser.data) 替換成 return page.get_paginated_response(pub_ser.data)
作用測(cè)試圖:(此方法主要用于游標(biāo)分頁(yè)中,因?yàn)橛螛?biāo)分頁(yè)并不能指定第幾頁(yè)第幾頁(yè),只有上一頁(yè)和下一頁(yè))
cursor游標(biāo)分頁(yè)
游標(biāo)分頁(yè)的cursor后面的值我們是不知道的,所以拼不出來(lái):
游標(biāo)分頁(yè)特點(diǎn):它是一種加密分頁(yè),只能看上一頁(yè)和下一頁(yè),速度快
總結(jié)
以上是生活随笔為你收集整理的Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Django框架深入了解_04(DRF之
- 下一篇: Django框架之DRF 认证组件源码分