作用:
用于版本的控制
内置的版本控制类
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)