版本

  • url中通过GET传参
    自定义的版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from django.http import HttpResponse
from django.shortcuts import render # Create your views here.
from rest_framework.views import APIView
from rest_framework.request import Request class ParamVersion(object):
def determin_version(self,request):
version = request.query_params.get('version')
return version class UsersView(APIView):
def get(self,request,*args,**kwargs):
# request首先是先从自己的类中拿,如果自己的类中没有,就去原生的那个类中的去拿,
# 否则就会抛出异常
# version = request._request.GET.get('version')
# print(version)
# version = request.query_param.get('version') # 和request._request.GET.get('version')取值完全一样
# print version
return HttpResponse('用户列表')
  • 使用内置的类
1
2
3
4
5
6
from rest_framework.versioning import QueryParameterVersioning
class UsersView(APIView):
versioning_class = QueryParameterVersioning
def get(self,request,*args,**kwargs):
print(request.version)
return HttpResponse('用户列表')

  • 这3个只需要在配置文件中设置就可以

  • 在url路径中传参(推荐使用)

1
2
3
4
5
6
REST_FRAMEWORK = {
'DEFAULT_VERSION_CLASS':'rest_framework.versioning.URLPathVersioning',
'DEFAULT_VERSION':'v1',
'ALLOWED_VERSIONS':['v1','v2'],
'VERSION_PARAM':'version',
}
1
2
3
4
class UsersView(APIView):
def get(self,request,*args,**kwargs):
print(request.version)
return HttpResponse('用户列表')
1
2
3
4
urlpatterns = [
# url(r'^users/',views.UsersView.as_view()),
url(r'^(?P<version>[v1|v2]+)/users/$',views.UsersView.as_view()),
]
  • 源码流程
    • 返回版本是在封装request之后,认证和权限之前做的
    • BaseVersioning对象

  • 里面有个rest framework封装的reverse(),内反向生成url,不需要指定版本,会自动生成,其实就是当前url的版本,本质上底层是使用了Django自带的reverse()实现的。
1
2
3
4
5
6
7
8大专栏  rest-framework源码解析和自定义组件----版本an>
9
10
11
12
13
14
class UsersView(APIView):
def get(self,request,*args,**kwargs):
self.dispatch()
# 获取版本
print(request.version)
# 获取版本的对象
print(request.versioning_scheme)
# 内置的反向生成url,不需要指定版本,会自动生成,其实是当前url的版本
u1 = request.versioning_scheme.reverse(viewname='uuu',request=request)
print(u1)
# 使用Django内置的反向生成url,必须要指定版本
u2 = reverse(viewname='uuu',kwargs={'version':1})
print(u2)
return HttpResponse('用户列表')
  • 除了这些,版本的实现还有很多
总结
  • 使用 配置文件

    1
    2
    3
    4
    5
    6
    REST_FRAMEWORK = {
    'DEFAULT_VERSION_CLASS':'rest_framework.versioning.URLPathVersioning',
    'DEFAULT_VERSION':'v1',
    'ALLOWED_VERSIONS':['v1','v2'],
    'VERSION_PARAM':'version',
    }
  • 路由系统

1
2
3
4
urlpatterns = [
# url(r'^users/',views.UsersView.as_view()),
url(r'^(?P<version>[v1|v2]+)/users/$',views.UsersView.as_view(),name='uuu'),
]
1
2
3
4
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^api/$',include('myapp.urls'))
]
  • 视图
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class UsersView(APIView):
def get(self,request,*args,**kwargs):
self.dispatch()
# 1.获取版本
print(request.version)
# 2.获取版本的对象
print(request.versioning_scheme)
# 3. 内置的反向生成url,不需要指定版本,会自动生成,其实是当前url的版本
u1 = request.versioning_scheme.reverse(viewname='uuu',request=request)
print(u1)
# 使用Django内置的反向生成url,必须要指定版本
u2 = reverse(viewname='uuu',kwargs={'version':1})
print(u2)
return HttpResponse('用户列表')
  • 源码流程,和认证的源码类似,
    • 匹配到url,然后到view视图里,执行父类的as_view()方法,该方法返回一个view函数,而在view()函数里返回的是dispatch()方法,我们就从dispatch()方法开始
    • 先封装好request,然后执行initial()实现版本然后才是认证,然后是权限的判断,后面就是访问频率了
    • 调用determine_version()返回的是一个元组,有两个元素,分别是版本和处理版本的对象
    • 版本是在determine_version()方法中拿到的,通过versioning_class()方法,获取到URLPathVersioning对象,默认是从配置文件中获取到的,和权限,节流等流程类似,只不过那些都是拿到一个列表,而版本的只需要拿到一个versioning_class就可以了,也可以设置到视图中。

源码下载

rest-framework源码解析和自定义组件----版本的更多相关文章

  1. Flume-ng源码解析之Sink组件

    作为启动流程中第二个启动的组件,我们今天来看看Sink的细节 1 Sink Sink在agent中扮演的角色是消费者,将event输送到特定的位置 首先依然是看代码,由代码我们可以看出Sink是一个接 ...

  2. Flume-ng源码解析之Source组件

    如果你还没看过Flume-ng源码解析系列中的启动流程.Channel组件和Sink组件,可以点击下面链接: Flume-ng源码解析之启动流程 Flume-ng源码解析之Channel组件 Flum ...

  3. admin源码解析及自定义stark组件

    admin源码解析 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单 ...

  4. Spring Boot @Enable*注解源码解析及自定义@Enable*

      Spring Boot 一个重要的特点就是自动配置,约定大于配置,几乎所有组件使用其本身约定好的默认配置就可以使用,大大减轻配置的麻烦.其实现自动配置一个方式就是使用@Enable*注解,见其名知 ...

  5. Flume-ng源码解析之Channel组件

    如果还没看过Flume-ng源码解析之启动流程,可以点击Flume-ng源码解析之启动流程 查看 1 接口介绍 组件的分析顺序是按照上一篇中启动顺序来分析的,首先是Channel,然后是Sink,最后 ...

  6. 43.Permission源码解析和自定义权限类

    drf的权限类位于permission模块   如何确定权限 认证.限流,权限决定是否应该接收请求或拒绝访问 权限检查在视图的最开始处执行,在继续执行其他代码前 权限检查通常会使用request.us ...

  7. Robot Framework 源码解析(1) - java入口点

    一直很好奇Robot Framework 是如何通过关键字驱动进行测试的,好奇它是如何支持那么多库的,好奇它是如何完成截图的.所以就打算研究一下它的源码. 这是官方给出的Robot framework ...

  8. Django rest framework源码分析(4)----版本

    版本 新建一个工程Myproject和一个app名为api (1)api/models.py from django.db import models class UserInfo(models.Mo ...

  9. Robot Framework源码解析(2) - 执行测试的入口点

    我们再来看 src/robot/run.py 的工作原理.摘录部分代码: from robot.conf import RobotSettings from robot.model import Mo ...

随机推荐

  1. ORBSLAM2的资源

    ORBSLAM2代码总结 https://blog.csdn.net/hzwwpgmwy/article/details/82462988 ORBSLAM2局部地图更新实现 https://blog. ...

  2. ILSVRC2012下载

    http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tarhttp://www.image-net.or ...

  3. Android开发学习3

    学习内容: 1.复选框CheckBox 2.ImageView & 使用第三方库加载网络图片 3.列表视图ListView 4.网格视图GridView 5.ScrollView & ...

  4. Django与AJAX-choice字段-MTV和MVC模型-sweetalert搭建页面

    Django中的choice字段 应用的场景: 用户信息举列:如用户性别.婚否.学历.工作状态等可以列举出来供选择的信息 书写models创建表模型: 数据的获取和查询: 总结: "&quo ...

  5. MFC的sendmessage和postmessage 以及sendmessagetimeout

    PostMessage只负责将消息放到消息队列中,不确定何时及是否处理,相当于异步操作,执行后马上返回SendMessage要等到受到消息处理的返回码(DWord类型)后才继续,相当于同步操作,一直在 ...

  6. NAIPC2018

    NAIPC2018 参考:http://www.cnblogs.com/LQLlulu/p/9513669.html?tdsourcetag=s_pctim_aiomsg https://www.cn ...

  7. HTTP1.0和HTTP1.1的一些区别

    HTTP1.0和HTTP1.1的一些区别 HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器 ...

  8. Cobbler_自动装系统

    Cobbler —自动装系统的操作步骤 Cobbler是一款自动化操作系统安装的实现,与PXE安装系统的区别就是可以同时部署多个版本的系统,而PXE只能选择一种系统. Cobbler 的安装 # 在一 ...

  9. 在Myeclipse10中配置tomcat后新建工程

    1.配置tomcat6.0 这里不在细说,和eclipse配置是一模一样的. 2.新建动态网站项目 3.配置显示服务器窗口 4.把项目与服务器链接 5.运行项目

  10. spring cloud关于feign client的调用对象列表参数、设置header参数、多环境动态参数试配

    spring cloud关于feign client的调用 1.有些场景接口参数需要传对象列表参数 2.有些场景接口设置设置权限等约定header参数 3.有些场景虽然用的是feign调用,但并不会走 ...