rest-framework之版本控制
阿新 • • 發佈:2018-12-18
作用:
用於版本的控制
內建的版本控制類
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 = URLPathVersioning def get_all(self, request,*args,**kwargs):
#獲取版本 print(request.version) # 路由反向解析,這種方式不好,麻煩 # from django.urls import reverse # url=reverse(viewname='cao',kwargs={'version':request.version}) # print(url) # 提供給咱的解析,反向生成url reverse_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物件中,就可以取出版本號 -反向解析: url2=request.versioning_scheme.reverse('ttt',request=request)