rest_framework框架——版本控制组件

API版本控制可以用来在不同的客户端使用不同的行为。REST框架提供了大量不同的版本设计。

版本控制是由传入的客户端请求决定的,并且可基于请求URL,或者基于请求头。

rest_framework

当使用版本控制时,request.version属性(字符串)与客户端请求的版本一致。
默认情况下,没有使用版本控制,request.version将会返回None

 versioning_class = api_settings.DEFAULT_VERSIONING_CLASS

    # APIView
    def initial(self, request, *args, **kwargs):
        """
        Runs anything that needs to occur prior to calling the method handler.
        """
        self.format_kwarg = self.get_format_suffix(**kwargs)

        # Perform content negotiation and store the accepted info on the request
        neg = self.perform_content_negotiation(request)
        request.accepted_renderer, request.accepted_media_type = neg

        # Determine the API version, if versioning is in use.
        version, scheme = self.determine_version(request, *args, **kwargs)
        request.version, request.versioning_scheme = version, scheme

    def determine_version(self, request, *args, **kwargs):
        """
        If versioning is being used, then determine any API version for the
        incoming request. Returns a two-tuple of (version, versioning_scheme)
        """
        if self.versioning_class is None:
            return (None, None)
        scheme = self.versioning_class()
        return (scheme.determine_version(request, *args, **kwargs), scheme)

除非明确设置,否则DEFAULT_VERSIONING_CLASS值为None.此例中request.version将会始终返回None
您还可以在一个单独的视图上设置版本控制方案。通常,不需要这样做,因为在全局范围内使用一个版本控制方案更有意义。如果确实需要这样做,请使用versioning_class属性。

from rest_framework.versioning import QueryParameterVersioning

class VersionTestAPI(APIView):

    versioning_class = QueryParameterVersioning

rest_framework .versioning中的5种版本控制方式

class AcceptHeaderVersioning(BaseVersioning):
    """
    GET /something/ HTTP/1.1
    Host: example.com
    Accept: application/json; version=1.0
    """
    pass

class URLPathVersioning(BaseVersioning):
    """
    To the client this is the same style as `NamespaceVersioning`.
    The difference is in the backend - this implementation uses
    Django's URL keyword arguments to determine the version.

    An example URL conf for two views that accept two different versions.

    urlpatterns = [
        url(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),
        url(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
    ]

    GET /1.0/something/ HTTP/1.1
    Host: example.com
    Accept: application/json
    """
    pass

class NamespaceVersioning(BaseVersioning):
    """
    To the client this is the same style as `URLPathVersioning`.
    The difference is in the backend - this implementation uses
    Django's URL namespaces to determine the version.

    An example URL conf that is namespaced into two separate versions

    # users/urls.py
    urlpatterns = [
        url(r'^/users/$', users_list, name='users-list'),
        url(r'^/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
    ]

    # urls.py
    urlpatterns = [
        url(r'^v1/', include('users.urls', namespace='v1')),
        url(r'^v2/', include('users.urls', namespace='v2'))
    ]

    GET /1.0/something/ HTTP/1.1
    Host: example.com
    Accept: application/json
    """
    pass

class HostNameVersioning(BaseVersioning):
    """
    GET /something/ HTTP/1.1
    Host: v1.example.com
    Accept: application/json
    """
    pass

class QueryParameterVersioning(BaseVersioning):
    """
    GET /something/?version=0.1 HTTP/1.1
    Host: example.com
    Accept: application/json
    """
    pass

以URLPathVersioning为例

  1. setting添加配置
INSTALLED_APPS = [
    ...
'VersionDemo'
    ...
]

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
    'ALLOWED_VERSIONS':['v1','v2'], # 允许的版本
    'VERSION_PARAM':'version', # 参数      #  1
    'DEFAULT_VERSION':'v1', # 默认版本
      }

2.url路由配置

urls.py

urlpatterns = [ re_path('api/(?P<version>[v1|v2]+)/', include('api.urls')), name='users-list']  # 2

api/urls.py

urlpatterns = [ path('test/', views.VersionTestView.as_view()),]
  1. 传递版本信息
http://127.0.0.1:8000/api/v1/test/
  1. 获取版本
request.version                 #  获取版本 

基于不同版本进行不同的行为

class VersionTestView(APIView):

    def get(self,request,version):      # 3      1,2,3处参数要保持一至,这里均为version
        if request.version == 'v2':
            return Response({'data':'v2'})
        return Response({'data':'v1'})

改变URL,如何反向解析

from rest_framework.reverse import reverse
reverse('users-list', request=request)

reverse函数将应用于转换任何请求版本的URL。

- NamespacedVersioning:类似命名空间

'v1:users-list'

原文地址:https://www.cnblogs.com/notfind/p/12043710.html

时间: 2024-08-30 05:50:47

rest_framework框架——版本控制组件的相关文章

rest-framework框架——版本

一.DRF版本控制介绍 随着项目更新,版本会越来越多,不能新的版本出现,旧版本就不再使用维护了.因此不同的版本会有不同的处理,且接口会返回不同的信息. API版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据). DRF提供了许多不同的版本控制方案.可能会有一些客户端因为某些原因不再维护了,但是我们后端的接口还要不断的更新迭代,这个时候通过版本控制返回不同的内容就是一种不错的解决方案. rest_framework.versioning里提供了五种版本控制方案如下所

rest_framework框架

rest_framework框架的认识 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 一  路由 可以通过路由as_view()传参 根据请求方式的不同执行对应不同的方法 在routers模块下 封装了很多关于路由的方法 , 最基础的BaseRouter类,给我提供自定制的接口. 下面这个方法给我们提供了自动生成两条带参数的url from rest_framework import routers from django.conf.urls import url,

rest_framework框架的封装特点和APIView请求生命周期

rest_framework框架的封装特点: import rest_framework from rest_framework.views import APIView from rest_framework.request import Request 在views.py中写出合适的api类,只需要继承rest_framework中generics中的某个类,重写我们需要的方法实现合适的逻辑即可 APIView请求生命周期 """ APIView的as_view(局部禁用

DRF版本控制组件

为什么要进行版本控制? 新旧版本的接口都要维护,发请求的时候带上版本号会返回不同的结果,例如bootstrap2.0 .3.0等都有文档 版本控制组件源码--- as_view调用View的dispatch方法,dispatch被重写了,所以调用APIView的dispatch方法 self是DemoView的实例化对象 把版本信息放在了request.version和request.versioning_scheme中 determine_version返回元祖(version, scheme

django rest_framework 框架的使用

django 的中间件 csrf Require a present and correct csrfmiddlewaretoken for POST requests that have a CSRF cookie, and set an outgoing CSRF cookie. This middleware should be used in conjunction with the {% csrf_token %} template tag. django 的中间件是基于 post 的

Laravel 框架版本如何选择

说明 很久以前在一个话题里面聊到的观点,很多同学在 Laravel 版本选择时候比较混淆,这里说下我的看法. 对 Laravel 框架发布周期不熟悉的同学请参阅 - Laravel 的发布路线图. 什么是 LTS 长期支持 (LTS)是一种软件的产品生命周期政策,特别是开源软件,它增加了软件开发过程及软件版本周期的可靠度.长期支持延长了软件维护的周期:它也改变了软件更新(补丁)的类型及频率以降低风险.费用及软件部署的中断时间,同时提升了软件的可靠性.但这并不必然包含技术支持. 在长期支持周期的开

visual studio如何修改c++项目的.net framework框架版本

一. 修改项目文件 在 Visual Studio 的“解决方案资源管理器”中,打开项目的快捷菜单,然后选择“卸载项目”. 这将为你的项目卸载项目文件 (.vcxproj). 在菜单栏上,依次选择“文件”.“打开”.“文件”. 在“打开文件”对话框中,导航到项目文件夹,然后打开项目文件 (.vcxproj). 在项目文件中,找到目标 Framework 版本的条目. 例如,如果你的项目设计为使用 .NET Framework 4.5, <PropertyGroup Label="Globa

rest_framework框架的基本组件

快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列化和反序列化为诸如json之类的表示形式的方式.我们可以通过声明与Django forms非常相似的序列化器(serializers)来实现. models部分: from django.db import models # Create your models here. class Book(models.Model): title=mode

十二.Django---framework框架 版本设置

一 .版本设置(url上版本迭代) https://www.jb51.net/article/166249.htm     版本控制 https://www.cnblogs.com/liqianglog/p/11133615.html    版本使用反向 https://www.cnblogs.com/welan/p/10141126.html   版本控制流程 1.局部版本(作用于单个视图) settings REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASS