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