drf -- 版本管理类

为了方便版本管理,drf为我们提供了5个版本管理类

  • QueryParameterVersioning (将版本信息以URL参数的形式传递)
  • URLPathVersioning (将版本信息以URL路径形式传递)
  • AcceptHeaderVersioning (将版本信息以请求头的形式传递)
  • HostNameVersioning (将版本信息以域名的方式传递,几乎不用)
  • NamespaceVersioning (将版本信息以别名定义,通过分发到同一视图,可以实现,几乎不用)

1.QueryParameterVersioning

源码分析:

class QueryParameterVersioning(BaseVersioning): #如果要配置版本的参数,可以通过他的父类去查看需要配置的参数名
    """
    GET /something/?version=0.1 HTTP/1.1
    Host: example.com
    Accept: application/json
    """
    invalid_version_message = _('Invalid version in query parameter.')

    def determine_version(self, request, *args, **kwargs):
        version = request.query_params.get(self.version_param, self.default_version)
        if not self.is_allowed_version(version):
            raise exceptions.NotFound(self.invalid_version_message)
        return version

#版本管理的父类,配置的参数看该类的参数
class BaseVersioning:
    default_version = api_settings.DEFAULT_VERSION  # 如果不传入版本号,默认的版本号
    allowed_versions = api_settings.ALLOWED_VERSIONS # 仅支持的所有版本,列表的形式,如果版本号不在里面,会报错,可不配置
    version_param = api_settings.VERSION_PARAM # 版本的参数名

    def determine_version(self, request, *args, **kwargs):
        msg = '{cls}.determine_version() must be implemented.'
        raise NotImplementedError(msg.format(
            cls=self.__class__.__name__
        ))

配置文件中settings.py的配置

REST_FRAMEWORK = {
    'VERSION_PARAM':'v', #版本号的参数名,可以任意配置,不配置默认参数名为version
    'DEFAULT_VERSION':"V1",#默认的版本号,可以不配置
    "ALLOWED_VERSIONS":["v1","v2","v3"] #可以配置仅支持的版本,如果版本不在这里,会抛出异常
    
    #配置该类后,就不用再视图函数中声明了,不过视图函数的优先级高于配置文件
    'DEFAULT_VERSION_CLASS':"from rest_framework.versioning.QueryParameterVersioning"
}

视图函数Viwes.py代码示例:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import QueryParameterVersioning

class StudentViewSet(APIView):

    versioning_class = QueryParameterVersioning

    def get(self,request,*args,**kwargs):
        print(request.version)
        return Response('ok')

路由文件urls.py的代码示例:

from django.urls import path

from student.views import StudentViewSet
urlpatterns = [
    path('info/',StudentViewSet.as_view())
]

2.URLPathVersioning

  • 用法基本与上面的类一样,只不过urls.py的写法不同
from django.urls import path

from student.views import StudentViewSet
urlpatterns = [
    # 这样的URL方式,与正则re_path方法相似,只是写法不同,url中的参数,还是会传递到 **kwargs中,
    #可以通过request.query_params获取
    # <str:version>的中的参数version必现与配置文件一致
    path('info/<str:version>/',StudentViewSet.as_view()) 
]

3.AcceptHeaderVersioning

  • 与 URLPathVersioning 类不同,URL中不用携带
  • 配置文件中依然可以配置
  • 不过在发送请求时,需要将版本参数和版本信息以请求头的信息携带发送

示例图片:

视图函数views.py代码示例

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.versioning import AcceptHeaderVersioning

class StudentViewSet(APIView):

    versioning_class = AcceptHeaderVersioning

    def get(self,request,*args,**kwargs):
        print(request.version)
        return Response('ok')
posted @   志强爱璇璇  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示