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

今天我们来说一说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

打开源码看看具体格式:

总结使用:

  1. 添加setting配置
  2. 设置路由
  3. 获取版本 
原文地址:https://www.cnblogs.com/ManyQian/p/9490805.html