zoukankan      html  css  js  c++  java
  • REST-Framework: 版本控制器

    目录

    版本控制器介绍:

    一 作用

    二 内置的版本控制类

    三 局部使用

    四 全局使用

    五 示例

    源码分析


    版本控制器介绍:

    为什么在开发过程中为什么会有不同的版本产生, 我们之前在Restful规范的时候的时候已经介绍过了, 这里不再赘述, 在Rest-framework中开发者就为我们内置了一个版本控制组件来帮助我们来更好地控制不同的版本, 下面我们就介绍一下在Rest-framework中如何使用的

    一 作用

    用于版本的控制

    二 内置的版本控制类

    1. QueryParameterVersioning  基于url的get传参方式

    2. URLPathVersioning              基于url的正则方式

    3. AcceptHeaderVersioning      基于accerp请求头的方式 

    4. NamespaceVersioning          基于Django路由系统的名称空间

    1.2两种版本控制类是使用的较多的, 其他的使用的比较少,在使用的时候和其他组件一样也分为局部使用和全局使用

    from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderVersioning,NamespaceVersioning,URLPathVersioning
    
    
    
    #基于url的get传参方式:QueryParameterVersioning------>如:/users?version=v1
    
    #基于url的正则方式:URLPathVersioning------>/v1/users/
    
    #基于 accept 请求头方式:AcceptHeaderVersioning------>Accept: application/json; version=1.0
    
    #基于主机名方法:HostNameVersioning------>v1.example.com
    
    #基于django路由系统的namespace:NamespaceVersioning------>example.com/v1/users/

    三 局部使用

    #在CBV类中加入
    
    versioning_class = URLPathVersioning

    四 全局使用

    REST_FRAMEWORK = {
    
    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning',
    
    'DEFAULT_VERSION': 'v1', # 默认版本(从request对象里取不到,显示的默认值)
    
    'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
    
    'VERSION_PARAM': 'version' # URL中获取值的key
    
    }

    五 示例

    基于正则的局部使用方式:

    url部分:

    from django.conf.urls import url, include
    
    from web.views import TestView
    
    
    
    urlpatterns = [
    
    url(r'^(?P<version>[v1|v2]+)/test/', TestView.as_view(), name='test'),
    
    ]

    views部分:
    局部使用在对应的视图类中加入版本控制的类即可, 

    from rest_framework.views import APIView
    
    from rest_framework.response import Response
    
    from rest_framework.versioning import URLPathVersioning
    
    
    
    
    
    class TestView(APIView):
    
    versioning_class = URLPathVersioning
    
    
    
    def get(self, request, *args, **kwargs):
    
    # 获取版本
    
    print(request.version)
    
    # 获取版本管理的类
    
    print(request.versioning_scheme)
    
    
    
    # 反向生成URL
    
    reverse_url = request.versioning_scheme.reverse('test', request=request)
    
    print(reverse_url)
    
    
    
    return Response('GET请求,响应内容')
     
    # 基于django内置,反向生成url
    
    from django.urls import reverse
    
    url2=reverse(viewname='ttt',kwargs={'version':'v2'})
    
    print(url2)

    源码分析

    #执行determine_version,返回两个值,放到request对象里
    
    version, scheme = self.determine_version(request, *args, **kwargs)
    
    request.version, request.versioning_scheme = version, scheme
    
    
    
    def determine_version(self, request, *args, **kwargs):
    
    #当配置上版本类之后,就会实例化
    
    if self.versioning_class is None:
    
    return (None, None)
    
    scheme = self.versioning_class()
    
    return (scheme.determine_version(request, *args, **kwargs), scheme)
     
    每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
  • 相关阅读:
    最新Navicat Premium12 破解方法,亲测可用
    (转)Navicat_12安装与破解激活,注册机亲测可用
    使用ApiPost模拟发送get、post、delete、put等http请求
    模拟POST、Get 请求的工具----APIpost(中文版POSTMAN)
    推荐一款接口文档生成工具,apipost,好用
    作为后端开发者,如何更优雅、便捷的生成接口文档?
    使用apipost调试api接口并快速生成接口文档的一些小技巧,比postman更好用
    中文版postman——apipost,不试一下,你就不知道它有多香
    ApiPost如何在预执行脚本里添加请求参数?
    ApiPost的预执行脚本和后执行脚本
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/13969689.html
Copyright © 2011-2022 走看看