• 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. 获取版本 
  • 相关阅读:
    【转】Linux目录结构FHS
    单链表是否有环并如何找到环入口
    【转】linux dd 的简单应用
    DataSet、ExecuteScalar、ExecuteReader
    解决Excel只验证前8行字符串的长度
    SQL Server UPSERT equivalent
    用通配符替换字符串
    从内存中查询表字段定义的长度大小
    C#判断一个字符串是否为整数
    page life cycle of master page with content page
  • 原文地址:https://www.cnblogs.com/ManyQian/p/9490805.html
Copyright © 2020-2023  润新知