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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

解析器介紹:

所謂解析器,就是前端傳過來的數(shù)據(jù),后端可以解析,從request.data中取出來,默認(rèn)的解析器配置是三種編碼格式都可以取

回到頂部

解析器的作用:

根據(jù)請求頭(content-type)選擇對應(yīng)的解析器對請求體內(nèi)容進(jìn)行處理,有application/json,x-www-form-urlencoded,form-data等格式

設(shè)置解析器就可以控制前端傳過來的數(shù)據(jù)類型進(jìn)行限制,比如說我只能解析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ù)據(jù)類型,這樣后端只能解析該類型數(shù)據(jù),其它類型的請求都會無效,當(dāng)然設(shè)置一種也可以設(shè)置多種)

局部使用:

測試:

全局使用:
先了解一下默認(rèn)解析三種格式的設(shè)置代碼:
全局設(shè)置:

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

三、響應(yīng)器:

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

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

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

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

訪問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文件)

訪問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

訪問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

訪問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ī)范里,提出過版本的概念,也就是說版本控制就是相對于接口而言,它有多個版本,就好像應(yīng)用程序、手機app都會更新版本一樣,會修改更新接口文件,這時候就不能在原接口進(jìn)行修改更新,應(yīng)該另起一個接口作為版本2(假設(shè)為v2)來提供給用戶使用,原來的版本可能是v1,那么v1和v2版本提供給外界的控制,就是版本控制。

通過路由拼接版本號或者放入請求頭中的途徑來獲取對應(yīng)版本號的接口,進(jìn)行請求。

from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning#基于url的get傳參方式:QueryParameterVersioning------>如:/users?version=v1 #基于url的正則方式:URLPathVersioning------>/v1/users/ #基于 accept 請求頭方式:AcceptHeaderVersioning------>Accept: application/json; version=1.0 #基于主機名方法: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對象里取不到,顯示的默認(rèn)值)'ALLOWED_VERSIONS': ['v1', 'v2'], # 允許的版本'VERSION_PARAM': 'version' # URL中獲取值的key -路由需要修改-url(r'^(?P<version>[v1|v2]+)/test/', views.Test.as_view()),


局部使用:


在視圖類中就可以通過:request.version取出當(dāng)前訪問哪個版本,相應(yīng)的取執(zhí)行相應(yīng)版本的代碼

回到頂部

五、DRF分頁器

前戲:批量創(chuàng)建多條數(shù)據(jù)用于測試分頁:

url(r'^pagetest/', views.PaginationTest.as_view()), # views.pyclass PaginationTest(APIView):# 批量創(chuàng)建publish記錄,用于測試分頁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ī)分頁

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記錄,用于測試分頁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()# 實例化出page對象page = PageNumberPagination() # ================ page相關(guān)參數(shù)配置開始 ================ ## # 每頁顯示10條,也可以在settings.py中添加全局配置('PAGE_SIZE': 10 )page.page_size = 10# # 設(shè)置每頁條數(shù)的拼接key(默認(rèn)為size)page.page_size_query_param = 'size0'# # 控制每頁最大顯示條數(shù):(這個控制僅限制于路徑后拼接設(shè)置size0=1000后,對其進(jìn)行限制)page.max_page_size = 30# # 設(shè)置定位的頁數(shù)的拼接key(默認(rèn)是page)page.page_query_param = 'page0' # ================ page相關(guān)參數(shù)配置結(jié)束 ================ ## 對數(shù)據(jù)進(jìn)行分頁處理:ret_page = page.paginate_queryset(publish_list, request, self)# 序列化pub_ser = PublishSer(instance=ret_page, many=True)return Response(pub_ser.data)

也可以在全局配置每頁顯示條數(shù):
測試:



偏移分頁

偏移分頁與普通分頁使用基本相同,類不同,配置的參數(shù)名稱不同

# 偏移分頁:def get(self, request, *args, **kwargs):# 拿到所有數(shù)據(jù)publish_list = models.Publish.objects.all()# 實例化出page對象page = LimitOffsetPagination() # ================ page相關(guān)參數(shù)進(jìn)行配置開始 ================ ## # 從標(biāo)桿位置往后取幾個,比如指定取10個page.default_limit = 10# # 拼接key值自定義# 拿幾條記錄的key值自定義page.limit_query_param = 'limit0'# 標(biāo)桿值(起始位置),從設(shè)置的offset0值那個位置往后拿limit0值的記錄page.offset_query_param = 'offset0'# # 設(shè)置最大取10條page.max_limit = 20 # ================ page相關(guān)參數(shù)進(jìn)行配置結(jié)束 ================ ## 對數(shù)據(jù)進(jìn)行分頁處理:ret_page = page.paginate_queryset(publish_list, request, self)# 序列化pub_ser = PublishSer(instance=ret_page, many=True)return Response(pub_ser.data)

補充:get_paginated_response的使用

將return Response(pub_ser.data) 替換成 return page.get_paginated_response(pub_ser.data)
作用測試圖:(此方法主要用于游標(biāo)分頁中,因為游標(biāo)分頁并不能指定第幾頁第幾頁,只有上一頁和下一頁)
cursor游標(biāo)分頁

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

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

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

總結(jié)

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

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