您的位置:首页 > 编程语言 > Python开发

python3-开发进阶 django-rest framework 中的 版本操作(看源码解说)

2018-08-17 16:46 1076 查看
今天我们来说一说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配置

设置路由

获取版本
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: