作用:
用于版本的控制
內置的版本控制類
from rest_framework.versioning import URLPathVersioning, QueryParameterVersioning, AcceptHeaderVersioning
#基于url的正則方式:URLPathVersioning------>/v1/users/(需要掌握這種)
#基于url的get傳參方式:QueryParameterVersioning------>如:/users?version=v1 #基于 accept 請求頭方式:AcceptHeaderVersioning------>Accept: application/json; version=1.0 #基于主機名方法:HostNameVersioning------>v1.example.com #基于django路由系統的namespace:NamespaceVersioning------>example.com/v1/users/
局部使用
#在CBV類中加入 versioning_class = URLPathVersioning
全局使用,在setting中配置:
REST_FRAMEWORK = {'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning','DEFAULT_VERSION': 'v1', # 默認版本(從request對象里取不到,顯示的默認值)'ALLOWED_VERSIONS': ['v1', 'v2'], # 允許的版本號'VERSION_PARAM': 'version' # URL中獲取值的key,根據哪個鍵去查詢 }
路由配置,基于正則的方式:
urlpatterns = [url(r'^(?P<version>[v1|v2]+)/books/$', views.Book.as_view({'get':'get_all'}),name='cao'),給路由重命名,為了后面做反向解析 ]
view.py-視圖層
# 版本控制 from rest_framework.versioning import URLPathVersioning, QueryParameterVersioning, AcceptHeaderVersioningclass Book(ViewSetMixin, APIView):# 局部使用versioning_class = URLPathVersioningdef get_all(self, request,*args,**kwargs):
#獲取版本print(request.version)# 路由反向解析,這種方式不好,麻煩# from django.urls import reverse# url=reverse(viewname='cao',kwargs={'version':request.version})# print(url)# 提供給咱的解析,為了反向生成urlreverse_url=request.versioning_scheme.reverse('cao',request=request)print(url)response = {'status': 100, 'msg': '查詢成功'}book_list = models.Book.objects.all()# 實例化產生一個加密分頁的對象page = CursorPagination()# 按nid排序page.ordering = 'nid'page_list = page.paginate_queryset(book_list, request, self)# 丟到序列化類中,完成序列化ser = MySer.BookSerializers(instance=page_list, many=True)# 最后返回數據return page.get_paginated_response(ser.data)
總結使用:
版本控制掌握的:URLPathVersioning-在setting中配置:'VERSION_PARAM':'version','DEFAULT_VERSION':'v1','ALLOWED_VERSIONS': ['v1', 'v2'],-局部使用:versioning_class = URLPathVersioning-全局使用:'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',-路由配置:url(r'^(?P<version>[v1|v2|v3]+)/books/$', views.Book.as_view({'get':'get_all'}),name='ttt'),-在視圖類中的request對象中,就可以取出版本號-反向解析:
因為request對象能取出版本號,內部自動填入
如果是路由有別的有名/無名分組,需要手動傳過去
url2=request.versioning_scheme.reverse('ttt',request=request)
?