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

本文介绍了在Django的rest_framework中如何实现接口版本控制。可以通过自定义方式或者利用内置的QueryParameterVersioning和URLPathVersioning类。在settings.py中配置,并在views.py中定义获取版本号的逻辑。同时提到了反向解析URL和源码分析,帮助理解版本控制的实现细节。
摘要由CSDN通过智能技术生成

通过自定义手段来实现后台获取接口版本号,也可以使用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()
在这里插入图片描述

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值