Django框架(二十九:rest_framework 版本)

通过自定义手段来实现后台获取接口版本号,也可以使用drf内置的类实现。如果使用内置的类,直接在REST_FRAMEWORK配置中,配置成内置类即可。
在utils包中新建version.py文件

from rest_framework.versioning import BaseVersioning

class Version(BaseVersioning):
    # determine: 确定,确认
    def determine_version(self, request, *args, **kwargs):
        # 获取此次GET请求的版本号
        # query_params:查询字符串
        version = request.query_params.get('version')
        return version

views.py

ORDER_DICT = {
    1: {
        'name': '鞋子',
        'price': 20,
        'color': 'red',
        'detail': '...',
        'type': '普通'
    },
    2: {
        'name': '风扇',
        'price': 20,
        'color': 'black',
        'detail': '...',
        'type': '普通'
    },
}

from utils.base_authenticate import PTPermission, IPThrottle, UserThrottle
from utils.version import Version
from rest_framework.versioning import QueryParameterVersioning, URLPathVersioning


class OrderView(APIView):
    authentication_classes = []
    permission_classes = []
    # QueryParameterVersioning:通过?version=1来获取版本号,和自定义的Version类功能差不多,但是QueryParameterVersioning提供了一些额外的配置在REST_FRAMEWORK中。
    versioning_class = URLPathVersioning
    # throttle_classes = [IPThrottle]


    def get(self, request, version):
        data = {}

        # 获取当前版本号
        version = request.version
        if version == 'v1':
            data['results'] = ORDER_DICT
        elif version == 'v2':
            # request.versioning_scheme: 指的是当前版本类的对象。
            url = request.versioning_scheme.reverse(viewname='order', request=request)
            data['results'] = {
                'goods': [
                    {'name': '苹果'}, {'name': '香蕉'}
                ],
                'current_url': url
            }
        return JsonResponse(data)

QueryParameterVersioning用于去GET参数中取version
URLPathVersioning:去url路径里面获取版本

settings.py

#版本
REST_FRAMEWORK = {
    "DEFAULT_VERSION":'v1',               #默认的版本
    "ALLOWED_VERSIONS":['v1','v2'],       #允许的版本
    "VERSION_PARAM":'version'             #GET方式url中参数的名字  ?version=xxx
}

反向解析访问的url:

path('order/', OrderView.as_view(), name='order'),

在这里插入图片描述

源码分析:
dispathch()
Django框架(二十九:rest_framework 版本)_第1张图片

determine_version()需要自己定义,返回值为version(版本)

URLPathVersioning源码也可以自己分析分析

你可能感兴趣的:(Django,前后端分离,rest_framework)