Django DRF版本号的处理

在restful规范中,后端的API中需要体现版本。如果项目比较大,需要些很多的视图类,在每一个类中都写一遍会比较麻烦,所以drf中也支持了全局配置。在每个版本处理的类中还定义了`reverse`方法,他是用来反向生成URL并携带相关的的版本信息用的。

python 复制代码
REST_FRAMEWORK = {
    "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning",  # 处理版本的类的路径
    "VERSION_PARAM": "version",  # URL参数传参时的key,例如:xxxx?version=v1
    "ALLOWED_VERSIONS": ["v1", "v2", "v3"],  # 限制支持的版本,None表示无限制
    "DEFAULT_VERSION": "v1",  # 默认版本
}

一、基于GET传递参数

1、settings.py

python 复制代码
REST_FRAMEWORK={
    "UNAUTHENTICATED_USER": None,

    "VERSION_PARAM":"version",  # 决定url中版本的参数值;不设置默认也是这个值,可以通过修改这里修改,例如改为"v";
    "DEFAULT_VERSION":"v1", # 默认版本
    "ALLOWED_VERSIONS":["v1","v2"] #支持的版本范围
}

2、urls.py

python 复制代码
urlpatterns = [
    # path('admin/', admin.site.urls),
    path('home/', views.HomeView.as_view(),name="hh"),
]

3、views.py

python 复制代码
from rest_framework.versioning import   QueryParameterVersioning

class HomeView(APIView):
    # 传递过程中可以携带版本信息
    # http://127.0.0.1:8000/home/?version=v1 ,会自动读出版本赋值给request.version
    versioning_class = QueryParameterVersioning

    def get(self,request):
        print(request.version)
        print(request.versioning_scheme)

        url = request.versioning_scheme.reverse("hh",request=request)
        print("反向生产URL:",url)

        return Response("...")

二、基于路由传递参数

1、urls.py

python 复制代码
urlpatterns = [
    # 下面这两种写法都可以,一种是基于re_path的路由
    # path('api/<str:version>/home/', views.HomeView.as_view(), name="hh"),
    re_path(r'^api/(?P<version>\w+)/home/',views.HomeView.as_view(),name="hh"),

]

2、settings.py

python 复制代码
REST_FRAMEWORK={
    "UNAUTHENTICATED_USER": None,

    "VERSION_PARAM":"version",  # 决定url中版本的参数值;不设置默认也是这个值,可以通过修改这里,修改;
    "DEFAULT_VERSION":"v1", # 默认版本
    "ALLOWED_VERSIONS":["v1","v2"] #支持的版本范围
}

3、views.py

python 复制代码
from rest_framework.versioning import   URLPathVersioning

class HomeView(APIView):
    # 传递过程中可以携带版本信息
    # http://127.0.0.1:8000/home/?version=v1 ,会自动读出版本赋值给request.version
    versioning_class = URLPathVersioning

    def get(self,request,*args,**kwargs):
        print(request.version)
        print(request.versioning_scheme)

        url = request.versioning_scheme.reverse("hh",request=request)
        print("反向生产URL:",url)

        return Response("...")

三、基于请求头传递参数

1、urls.py

python 复制代码
urlpatterns = [
    # 基于请求头传递参数
    path('api/home/', views.HomeView.as_view(), name="hh"),
]

2、views.py

python 复制代码
from rest_framework.versioning import   QueryParameterVersioning,URLPathVersioning,AcceptHeaderVersioning

class HomeView(APIView):
    versioning_class = AcceptHeaderVersioning

    def get(self,request,*args,**kwargs):
        print(request.version)
        print(request.versioning_scheme)

        url = request.versioning_scheme.reverse("hh",request=request)
        print("反向生产URL:",url)

        return Response("...")

四、在实际项目中,第二种通过URL传递版本号的方式还是比较常用,在使用的时候,可以通过全局配置,在views中就不需要在引入和单独设置了,可以直接使用,案例如下:

1、settings.py

python 复制代码
REST_FRAMEWORK={
    # 版本号传递全局设置
    "VERSION_PARAM":"version",  # 决定url中版本的参数值;不设置默认也是这个值,可以通过修改这里,修改;
    "DEFAULT_VERSION":"v1", # 默认版本
    "ALLOWED_VERSIONS":["v1","v2"], #支 持的版本范围
    "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.URLPathVersioning",
}

2、urls.py

python 复制代码
  # 基于URL传递参数
    path('api/<str:version>/home/', views.HomeView.as_view(), name="hh"),

3、views.py

python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response

class HomeView(APIView):
    def get(self,request,*args,**kwargs):
        print(request.version)
        print(request.versioning_scheme)
        url = request.versioning_scheme.reverse("hh",request=request)
        print("反向生产URL:",url)
        return Response("...")
相关推荐
Java知识技术分享4 分钟前
使用LangChain构建第一个ReAct Agent
python·react.js·ai·语言模型·langchain
奔跑吧邓邓子14 分钟前
【Python爬虫(44)】分布式爬虫:筑牢安全防线,守护数据之旅
开发语言·分布式·爬虫·python·安全
RainbowSea34 分钟前
9-1. MySQL 性能分析工具的使用——last\_query\_cost,慢查询日志
数据库·sql·mysql
程序员 小濠40 分钟前
接口测试基础 --- 什么是接口测试及其测试流程?
自动化测试·python·测试工具·职场和发展·appium·接口测试·压力测试
程序媛徐师姐1 小时前
Python基于Django的酒店推荐系统【附源码】
python·django·酒店·酒店推荐·python django·酒店推荐系统·python酒店推荐系统
Sui_Network1 小时前
Sui 如何支持各种类型的 Web3 游戏
大数据·数据库·人工智能·游戏·web3·区块链
~kiss~1 小时前
python的thrift2pyi学习
windows·python·学习
ZKNOW甄知科技1 小时前
IT服务运营管理体系的常用方法论与实践指南(上)
大数据·数据库·人工智能
奔跑吧邓邓子1 小时前
【Python爬虫(45)】Python爬虫新境界:分布式与大数据框架的融合之旅
开发语言·分布式·爬虫·python·大数据框架
Luke Ewin1 小时前
根据音频中的不同讲述人声音进行分离音频 | 基于ai的说话人声音分离项目
人工智能·python·音视频·语音识别·声纹识别·asr·3d-speaker