• python3-开发进阶 django-rest framework 中的 版本操作(看源码解说)


    今天我们来说一说rest framework 中的 版本 操作的详解

    首先我们先回顾一下 rest framework的流程:

    请求进来走view ,然后view调用视图的dispath函数

    为了演示方便我们先来启一个项目:

    在settings 中 INSTALLED_APPS 添加 rest_framework ,

    在view.py 中创建一个视图类 假使来个课程类吧:

    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework.renderers import JSONRenderer 
     #只返回JS   #,BrowsableAPIRenderer    渲染器正常不用,容易出BUG 
    
    
    from django.shortcuts import HttpResponse
    
    class CourseView(APIView):
        renderer_classes = [JSONRenderer,]  #也可以在setting中设置
        def get(self,request,*args,**kwargs):
         self.dispath #方便查看源码
    return Response('...')

    看request

     看看initial

     

    我们就返回去看

    我们再回去看看下面

    点进去看看

     

    我们来配置一个类QueryParameterVersioning

    #在视图中引入QueryParameterVersioning
    from rest_framework.versioning import QueryParameterVersioning
    
    #写到类中
    versioning_class = QueryParameterVersioning

    这下我们就去看QueryParameterVersioning这个类

     

    我们考虑一个问题,在新的request中怎么找到老的 request!就是新request._request 就可以获得老request,

     实质上就是获取url中GET传来的参数

     我们再回去继续往下看

     

    综合上面,函数determine_version 是指就是获取url中的version的对应的值,最后再返回!

    我们再回去看:

    结论就是我们在CourseView类中get方法可以用 request.version 获取版本的值

     看下面演示:

    在CourseView类中get方法打印一下  request.version

    当没传值:

    当传值 ?version =v1

     

    在现实开发中,不可能有几百上千的版本,我们如何去限制版本,继续看源码

    这是如何操作的,继续看源码

     我们发现又是一个配置项

    为了演示需要我们在setting中加入  

    REST_FRAMEWORK={
    'ALLOWED_VERSIONS':['v1`,'v2']    #假使这些是允许的版本
    }

     我们发现不在配置中,就显示不允许这个版本

    当然版本参数的名字默认是version,你想换别的名称也是可以的,一样在setting中添加:

    REST_FRAMEWORK={
        'VERSION_PARAM':‘version’    #参数
        ‘DEFAULT_VERSION’: ‘v1’,    #默认版本   
    }

    这样的话,在url中可以不传版本的值,也可以取到默认版本的值, 

    在实际开发中,我们不可能每个视图都写成这样,所以我们在setting 中配置  

    具体格式:

    #setting 中配置
    REST_FRAMEWORK={
        'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.QueryParameterVersioning'
    }

    这时候我们又考虑这样一个问题:

    我们想体现版本的格式是如下所示,

     

    我们用上面的方法已经无法解决这个问题!我们引入新的知识点:

    from rest_framework.versioning import URLPathVersioning

    这个URLPathVersioning 是什么?我们来看一下他的源码:

    我们来配置一下这个URL:

    视图里改一下:

     versioning_class = URLPathVersioning

    url也改下:

    当然url 也可以 换正则来判断w+也可以,但要在setting中配置了版本的范围

    #url中
    urlpatterns = [
        url(r'^(?P<version>w+)/course/$', course.CourseView.as_view()),
    
    ]

    总结:

    上面两个方法哪个比较好呢?当然是第二个,所以以后写版本的话就用 URLPathVersioning

    还有在上面演示的url中,我们可以把版本写在分发之前,就不用再分发之后还要重复的写!这也是要注意的地方!

     版本写法不知这两种还支持别的方法,但是我们推荐用 URLPathVersioning 最简洁,方便,我们再来了解了解别的版本的方法,来看rest_framework的源码:

    from rest_framework.versioning import BaseVersioning

    打开源码看看具体格式:

    总结使用:

    1. 添加setting配置
    2. 设置路由
    3. 获取版本 
  • 相关阅读:
    golang 实现生产者消费者模式(转)
    ssh设置免密登录后登录仍需密码可能的原因,以及 ssh 出问题或的调试方法
    http 请求 Cros 跨域问题记录(转)
    问题解决——SSH时出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!(转)
    Git撤销本地commit(转)
    golang project 不显示文件夹 或者某个包明明能 import 但就是 import 不进来,提示Unresolved reference
    Qt6.2.4 qml 实现登录注册及显示详情demo
    Qt6.2.4 qml 实现文件选择与内容读取
    【转载】Qt6.2.4 qml ChartView 实现饼状图与问题解决
    【转载】AntvX6 流程图 demo 基于原生 js 支持导入与导出数据
  • 原文地址:https://www.cnblogs.com/ManyQian/p/9490805.html
Copyright © 2020-2023  润新知