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. 基于子域名

 

posted @ 2021-01-18 15:47  Sch01aR#  阅读(88)  评论(0编辑  收藏  举报