rest-framework之版本控制
作用:
用于版本的控制
内置的版本控制类
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, AcceptHeaderVersioning class 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对象中,就可以取出版本号 -反向解析:
因为request对象能取出版本号,内部自动填入
如果是路由有别的有名/无名分组,需要手动传过去
url2=request.versioning_scheme.reverse('ttt',request=request)