• DRF


    自定义类实现:

    views.py:

    from django.shortcuts import HttpResponse
    from rest_framework.views import APIView
    from rest_framework.versioning import BaseVersioning
    
    
    """ 自定义类实现版本 """
    class MyVersion(BaseVersioning):
        def determine_version(self, request, *args, **kwargs):
            # 获取 version 参数的值
            version = request.query_params.get("version")
            return version
    
    
    class UserView(APIView):
        
        versioning_class = MyVersion  # 设置版本类
    
        def get(self, request, *args, **kwargs):
            print(request.version)  # 打印版本
            return HttpResponse("用户列表")
    

    访问 /user/?version=v3

    内置类实现:

    settings.py 中进行默认的配置

    REST_FRAMEWORK = {
        # 设置全局的版本类
        "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.QueryParameterVersioning",
        # 设置默认的版本
        "DEFAULT_VERSION": "v1",
        # 设置有哪些版本
        "ALLOWED_VERSIONS": ["v1", "v2", ],
        # 设置版本的访问参数,默认为 version
        "VERSION_PARAM": "ver",
    }
    

    1. 通过所 get 请求所传递的参数获取版本

    views.py:

    from django.shortcuts import HttpResponse
    from rest_framework.views import APIView
    from rest_framework.versioning import QueryParameterVersioning
    
    
    class OrderView(APIView):
    
        # 设置局部视图类
        versioning_class = QueryParameterVersioning
    
        def get(self, request, *args, **kwargs):
            # 获取版本
            print(request.version)
            # 获取版本的对象
            # print(request.versioning_scheme)
            return HttpResponse("订单页面")
    

    访问 /order/,返回的是 settings.py 中设置默认的版本 v1

    访问 /order/?ver=v2,返回的是 v2

    访问 /order/?ver=v3,报错

    此时并不会使用默认的版本值

    2. 通过 URL 路径获取版本

    在 urls.py 中进行路径的正则匹配

    from django.urls import re_path
    from drf import views
    
    urlpatterns = [
        re_path(r'^(?P<ver>[v1|v2]+)/order/$', views.OrderView.as_view()),
    ]
    

    views.py:

    from django.shortcuts import HttpResponse
    from rest_framework.views import APIView
    from rest_framework.versioning import URLPathVersioning
    
    
    class OrderView(APIView):
    
        # 设置局部视图类
        versioning_class = URLPathVersioning
    
        def get(self, request, *args, **kwargs):
            # 获取版本
            print(request.version)
            # 获取版本的对象
            # print(request.versioning_scheme)
            return HttpResponse("订单页面")
    

    分别访问 /v1/order/ 和 /v2/order/

    因为在正则中将允许的版本写死了,所以访问其他的版本会报 404

    3. 反向生成 URL

    urls.py:

    from django.urls import re_path
    from drf import views
    
    urlpatterns = [
        # name 是设置别名
        re_path(r'^(?P<ver>[v1|v2]+)/order/$', views.OrderView.as_view(), name="orderlist"),
    ]
    

    views.py:

    from django.shortcuts import HttpResponse
    from rest_framework.views import APIView
    from rest_framework.versioning import URLPathVersioning
    from django.urls import reverse
    
    
    class OrderView(APIView):
    
        # 设置局部视图类
        versioning_class = URLPathVersioning
    
        def get(self, request, *args, **kwargs):
            # 基于 Rest Framework 的反向生成 URL
            u1 = request.versioning_scheme.reverse(viewname="orderlist", request=request)
            print(u1)
    
            # 基于 Django 的反向生成 URL
            u2 = reverse(viewname="orderlist", kwargs={"ver": "v1"})
            print(u2)
    
            return HttpResponse("订单页面")
    

    访问 /v2/order/

    其他的内置类

    1. 基于请求头

    2. 基于子域名

  • 相关阅读:
    MySQL基础
    mysql新
    第四章 常用模块
    第三章 函数编程
    第二章 数据类型和文件操作
    基础语法
    day24 面向对象与实例属性
    day21
    详解 Eclipse 中的快速 Java 编码(代码模板)
    补缴2个月社保折腾1年多 刁钻政策玩死人
  • 原文地址:https://www.cnblogs.com/sch01ar/p/14293089.html
Copyright © 2020-2023  润新知