今天我们来说一说rest framework 中的 版本 操作的详解
首先我们先回顾一下 rest framework的流程:
请求进来走view ,然后view调用视图的dispath函数
为了演示方便我们先来启一个项目:
在settings 中 INSTALLED_APPS 添加 rest_framework ,
在view.py 中创建一个视图类 假使来个课程类吧:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.renderers import JSONRenderer #只返回JS #,BrowsableAPIRenderer 渲染器正常不用,容易出BUG from django.shortcuts import HttpResponse class CourseView(APIView): renderer_classes = [JSONRenderer,] #也可以在setting中设置 def get(self,request,*args,**kwargs):
self.dispath #方便查看源码 return Response('...')
看request
看看initial
我们就返回去看
我们再回去看看下面
点进去看看
我们来配置一个类QueryParameterVersioning
#在视图中引入QueryParameterVersioning from rest_framework.versioning import QueryParameterVersioning #写到类中 versioning_class = QueryParameterVersioning
这下我们就去看QueryParameterVersioning这个类
我们考虑一个问题,在新的request中怎么找到老的 request!就是新request._request 就可以获得老request,
实质上就是获取url中GET传来的参数
我们再回去继续往下看
综合上面,函数determine_version 是指就是获取url中的version的对应的值,最后再返回!
我们再回去看:
结论就是我们在CourseView类中get方法可以用 request.version 获取版本的值
看下面演示:
在CourseView类中get方法打印一下 request.version
当没传值:
当传值 ?version =v1
在现实开发中,不可能有几百上千的版本,我们如何去限制版本,继续看源码
这是如何操作的,继续看源码
我们发现又是一个配置项
为了演示需要我们在setting中加入
REST_FRAMEWORK={ 'ALLOWED_VERSIONS':['v1`,'v2'] #假使这些是允许的版本 }
我们发现不在配置中,就显示不允许这个版本
当然版本参数的名字默认是version,你想换别的名称也是可以的,一样在setting中添加:
REST_FRAMEWORK={ 'VERSION_PARAM':‘version’ #参数 ‘DEFAULT_VERSION’: ‘v1’, #默认版本 }
这样的话,在url中可以不传版本的值,也可以取到默认版本的值,
在实际开发中,我们不可能每个视图都写成这样,所以我们在setting 中配置
具体格式:
#setting 中配置 REST_FRAMEWORK={ 'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning' }
这时候我们又考虑这样一个问题:
我们想体现版本的格式是如下所示,
我们用上面的方法已经无法解决这个问题!我们引入新的知识点:
from rest_framework.versioning import URLPathVersioning
这个URLPathVersioning 是什么?我们来看一下他的源码:
我们来配置一下这个URL:
视图里改一下:
versioning_class = URLPathVersioning
url也改下:
当然url 也可以 换正则来判断w+也可以,但要在setting中配置了版本的范围
#url中 urlpatterns = [ url(r'^(?P<version>w+)/course/$', course.CourseView.as_view()), ]
总结:
上面两个方法哪个比较好呢?当然是第二个,所以以后写版本的话就用 URLPathVersioning
还有在上面演示的url中,我们可以把版本写在分发之前,就不用再分发之后还要重复的写!这也是要注意的地方!
版本写法不知这两种还支持别的方法,但是我们推荐用 URLPathVersioning 最简洁,方便,我们再来了解了解别的版本的方法,来看rest_framework的源码:
from rest_framework.versioning import BaseVersioning
打开源码看看具体格式:
总结使用:
- 添加setting配置
- 设置路由
- 获取版本