博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
前后端分离djangorestframework——版本控制组件
阅读量:5965 次
发布时间:2019-06-19

本文共 2386 字,大约阅读时间需要 7 分钟。

什么是版本控制

在实际开发中,随着时间的更新迭代,我们维护的项目可能会有很多个版本,所以我们写的API也有很多个版本,但是迭代到高版本,不可能以前的版本就不用了,比如一个手机端的app,不定期发布新版本,肯定有用户不会去升级新版本,所以旧版本的软件当然也可以正常使用的

 

所以,我们要对其做版本控制,多个版本共存

 

使用DRF的版本控制组件

新建一个drfversion的django项目,现在该目录的settings.py文件里的app添加rest_framework,建一个叫DRF的app,做好对应的路由分发:

 

 

 

创建一个试图类,其中request.version是读DRF的源码所得,version就是版本参数

 

 

且还需要在配置文件里配置如下才行:

 

REST_FRAMEWORK = {    "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning", # DRF自带的    "DEFAULT_VERSION": "v1", #默认的版本    "ALLOWED_VERSIONS": "v1, v2", #允许的版本    "VERSION_PARAM": "ver" # url上的关键词,如:/XX?ver=v1}

 

启动项目:

默认就是v1版本

访问v2:

 

访问v3:

 

 

version到底是什么,还有通过读源码得到这个versioning_schme,这两个参数是在源码中看到的:

 

 打印试试:

对了,这个versioning_schme就是刚才我们在配置文件里配置那个参数

其实DRF还有很多这种版本控制分发组件,都在versioning模块里:from rest_framework import versioning

 

一共这么多,看名字就知道大概是什么用法,最后一个就是刚才用到的

 

 自定义版本控制组件

 从前面可以得知,就只需要再自定义一个versioning类就可以了

再看DRF自带的versioning,都定义额这个determine_version

 

 且读源码可知,如果自定义一个versioning,那就必须要定义一个这个determine_version方法,注意看我自定义的Myversion没有继承DRF提供的版本控制类

 

 

最后就是在settings.py里应用上就行了,就跟django的中间件一样:

 

view(其实没有作改动):

 

 

运行,访问测试:

正常访问,而且打印的结果,这就是我们自定义的versioning

 

注意:自定义版本控制组件类确实不需要继承DRF自带的BaseVersioning类就可以实现版本控制,我上面代码中继承的是object,当然也可以继承上,效果是一样的,就不展示访问测试页面了

 

相关代码: 

version:

from rest_framework.versioning import BaseVersioning# class MyVersion(BaseVersioning):  可以不继承也行class MyVersion(object):    def determine_version(self, request, *args, **kwargs):        version = request.query_params.get('ver', 'v1')        return version

 

url:

from django.contrib import adminfrom django.urls import path, re_path, includeurlpatterns = [    path('admin/', admin.site.urls),    re_path(r'test/', include(('DRF.urls'))),]
from django.urls import path, re_pathfrom DRF.views import DemoViewurlpatterns = [    re_path(r'^version/', DemoView.as_view()),]

 

view:

from django.shortcuts import render# Create your views here.from rest_framework.views import APIViewfrom rest_framework.views import Responseclass VersionView(APIView):    def get(self, request):        print('version', request.version)        print('versioning_scheme', request.versioning_scheme)        if request.version == 'v1':            return Response('v1版本')        elif request.version == 'v2':            return Response('v2版本')        return Response('不存在的版本')

 

 

 

总结:

  • 版本控制,需要在配置文件里配置参数
  • 自定义版本控制,必须定义determine_version方法,可以不用继承BaseVersioning类
  • 获取url的条件参数用request.query_params

 

转载于:https://www.cnblogs.com/yangva/p/10424670.html

你可能感兴趣的文章
CEF js调用C#封装类含注释
查看>>
麦克劳林
查看>>
延时接通电路
查看>>
周爱民:真正的架构师是没有title的(图灵访谈)
查看>>
Eclipse SVN修改用户名和密码
查看>>
架构师的职责都有哪些?
查看>>
SVN: bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7
查看>>
jsp内置对象作业3-application用户注册
查看>>
android115 自定义控件
查看>>
iOS uuchart 用法
查看>>
c# 多线程 调用带参数函数
查看>>
JQuery 如何选择带有多个class的元素
查看>>
The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
查看>>
VS快速生成JSON数据格式对应的实体
查看>>
Word2vec 模型载入(tensorflow)
查看>>
Linux内核——定时器和时间管理
查看>>
J2EE之初识JSP
查看>>
RabbitMq消息序列化简述
查看>>
i.e., e.g., etc.
查看>>
git忽略文件【转】
查看>>