日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(二)

發(fā)布時(shí)間:2024/9/30 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(二) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

解析器介紹:

所謂解析器,就是前端傳過(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è)置:

-------------------------------------------------------------------- 注:如果你對(duì)python感興趣,我這有個(gè)學(xué)習(xí)Python基地,里面有很多學(xué)習(xí)資料,感興趣的+Q群:895817687 --------------------------------------------------------------------在setting中配置:REST_FRAMEWORK = {"DEFAULT_PARSER_CLASSES":['rest_framework.parsers.JSONParser',]}

三、響應(yīng)器:

回到頂部
響應(yīng)器的作用:
根據(jù)用戶請(qǐng)求URL 或 用戶可接受的類型,篩選出合適的 渲染組件。

回到頂部
響應(yīng)器的使用:

-from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer -不用動(dòng),就用全局配置即可 -全局使用: -在setting中配置 'DEFAULT_RENDERER_CLASSES': [ 'rest_framework.renderers.JSONRenderer', ] -局部使用: -在視圖類中配置: renderer_classes = [JSONRenderer, BrowsableAPIRenderer]

響應(yīng)器的內(nèi)置渲染器:
顯示json格式:JSONRenderer

訪問(wèn)URL:http://127.0.0.1:8000/test/?format=json http://127.0.0.1:8000/test.json http://127.0.0.1:8000/test/

默認(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è):def get(self, request, *args, **kwargs):# 拿到所有數(shù)據(jù)publish_list = models.Publish.objects.all()# 實(shí)例化出page對(duì)象page = CursorPagination()# ================ page相關(guān)參數(shù)進(jìn)行配置開(kāi)始 ================ ## # 每頁(yè)顯示條數(shù)page.page_size = 5# # 查詢的key值自定義,默認(rèn)是cursor,無(wú)需更改page.cursor_query_param = 'cursor'# 游標(biāo)分頁(yè)會(huì)將記錄進(jìn)行排序,然后根據(jù)排序的記錄進(jìn)行分頁(yè)顯示,設(shè)置排序依據(jù)page.ordering = 'id'# ================ 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)# 如果使用Response返回?cái)?shù)據(jù),就不知道怎么定位上一頁(yè)和下一頁(yè)了# return Response(pub_ser.data)# 使用get_paginated_response,返回結(jié)果return page.get_paginated_response(pub_ser.data)

游標(biāo)分頁(yè)的cursor后面的值我們是不知道的,所以拼不出來(lái):

游標(biāo)分頁(yè)特點(diǎn):它是一種加密分頁(yè),只能看上一頁(yè)和下一頁(yè),速度快

總結(jié)

以上是生活随笔為你收集整理的Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。