zoukankan      html  css  js  c++  java
  • 前后端分离djangorestframework——版本控制组件

    什么是版本控制

    在实际开发中,随着时间的更新迭代,我们维护的项目可能会有很多个版本,所以我们写的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 admin
    from django.urls import path, re_path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        re_path(r'test/', include(('DRF.urls'))),
    ]
    from django.urls import path, re_path
    from DRF.views import DemoView
    urlpatterns = [
        re_path(r'^version/', DemoView.as_view()),
    ]

    view:

    from django.shortcuts import render
    # Create your views here.
    from rest_framework.views import APIView
    from rest_framework.views import Response
    
    
    class 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
  • 相关阅读:
    CADisplayLink
    对项目重命名
    TCP|UDP|Http|Socket
    CoreAnimation|动画
    Autolayout
    通讯录
    本地通知
    用于做 Android 屏幕自适应的文章资源
    Java String.format 自动补全不够的位数
    不同语言之间 日期格式转换
  • 原文地址:https://www.cnblogs.com/Eeyhan/p/10424670.html
Copyright © 2011-2022 走看看