06 Django REST Framework 版本控制
01-版本控制
- 对接口进行版本控制只是一种杀死已部署客户端的“礼貌”方式。
- - 罗伊菲尔丁。
- 1. API版本控制允许您更改不同客户端之间的行为。REST框架提供了许多不同的版本控制方案。
- 2. 版本控制由传入的客户端请求确定,可以基于请求URL,也可以基于请求标头。
- 3. 有许多有效的方法来处理版本控制。非版本化系统也是合适的,特别是如果您正在为具有多个客户端的长期系统进行工程设计。
02-版本控制方案
详解:https://www.django-rest-framework.org/api-guide/versioning/
03-版本控制的使用
3.1 全局配置
这里我们以 URLPathVersioning 为例,还是在项目的settings.py中REST_FRAMEWORK配置项下配置:
- REST_FRAMEWORK = {
- ...
- # 去url路径里面获取版本
- 'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
- 'DEFAULT_VERSION': 'v1', # 默认的版本
- 'ALLOWED_VERSIONS': ['v1', 'v2'], # 允许的版本
- 'VERSION_PARAM': 'version', # 版本的参数名与URL conf中一致
- }
urls.py
- urlpatterns = [
- ...
- url(r'^(?P<version>[v1|v2]+)/publishers/$', views.PublisherViewSet.as_view({'get': 'list', 'post': 'create'})),
- url(r'^(?P<version>[v1|v2]+)/publishers/(?P<pk>\d+)/$', views.PublisherViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'})),
- ]
我们可以在视图中自定义具体的行为,下面以不同的版本返回不同的序列化类为例:
- class PublisherViewSet(ModelViewSet):
- queryset = models.Publisher.objects.all()
- def get_serializer_class(self):
- """不同的版本使用不同的序列化类"""
- # request.version:获取版本
- if self.request.version == 'v1':
- return PublisherModelSerializerVersion1
- else:
- return PublisherModelSerializer
3.2 局部配置
注意,通常我们是不会单独给某个视图设置版本控制的,如果你确实需要给单独的视图设置版本控制,你可以在视图中设置versioning_class属性,如下:
- class PublisherViewSet(ModelViewSet):
- ...
- versioning_class = URLPathVersioning
04-反向解析url
- # api/urls.py
- from django.urls import path,re_path
- from .views import UserView
- urlpatterns = [
- re_path('(?P<version>[v1|v2]+)/users/', UserView.as_view(),name = 'api_user'),
- ]
- # api/views.py
- from django.shortcuts import render,HttpResponse
- from rest_framework.views import APIView
- from rest_framework.request import Request
- class UserView(APIView):
- def get(self,request,*args,**kwargs):
- #获取版本
- print(request.version)
- #获取处理版本的对象
- print(request.versioning_scheme)
- #获取浏览器访问的url,reverse反向解析
- #需要两个参数:viewname就是url中的别名,request=request是url中要传入的参数
- #(?P<version>[v1|v2]+)/users/,这里本来需要传version的参数,但是version包含在request里面(源码里面可以看到),所有只需要request=request就可以
- url_path = request.versioning_scheme.reverse(viewname='api_user',request=request)
- print(url_path)
- # self.dispatch
- return HttpResponse('用户列表')
05-versioning_class
06-URLPathVersioning源码
- class URLPathVersioning(BaseVersioning):
- """
- To the client this is the same style as `NamespaceVersioning`.
- The difference is in the backend - this implementation uses
- Django's URL keyword arguments to determine the version.
- An example URL conf for two views that accept two different versions.
- urlpatterns = [
- url(r'^(?P<version>[v1|v2]+)/users/$', users_list, name='users-list'),
- url(r'^(?P<version>[v1|v2]+)/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
- ]
- GET /1.0/something/ HTTP/1.1
- Host: example.com
- Accept: application/json
- """
- invalid_version_message = _('Invalid version in URL path.')
- def determine_version(self, request, *args, **kwargs):
- version = kwargs.get(self.version_param, self.default_version)
- if not self.is_allowed_version(version):
- raise exceptions.NotFound(self.invalid_version_message)
- return version
- def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
- if request.version is not None:
- kwargs = {} if (kwargs is None) else kwargs
- kwargs[self.version_param] = request.version
- return super(URLPathVersioning, self).reverse(
- viewname, args, kwargs, request, format, **extra
- )
url配置案例:
6.1 determine_version
里面有个is_allowed_version,点进去可以看到一些基本参数 (继承BaseVersioning基类)
- class BaseVersioning(object):
- #默认的版本
- default_version = api_settings.DEFAULT_VERSION
- #允许的版本
- allowed_versions = api_settings.ALLOWED_VERSIONS
- #默认参数(是version,比如你可以自定义为v)
- version_param = api_settings.VERSION_PARAM
- def determine_version(self, request, *args, **kwargs):
- msg = '{cls}.determine_version() must be implemented.'
- raise NotImplementedError(msg.format(
- cls=self.__class__.__name__
- ))
- def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
- return _reverse(viewname, args, kwargs, request, format, **extra)
- def is_allowed_version(self, version):
- if not self.allowed_versions:
- return True
- return ((version is not None and version == self.default_version) or
- (version in self.allowed_versions))
06 Django REST Framework 版本控制的更多相关文章
- Django REST framework - 版本控制
目录 Django REST framework 版本控制 为什么需要版本控制 DRF提供了5种版本控制方案 版本控制系统的使用 全局配置 局部配置 获取版本信息 Django REST framew ...
- Django rest framework 版本控制(源码分析)
基于上述分析 #2.处理版本信息 处理认证信息 处理权限信息 对用户的访问频率进行限制 self.initial(request, *args, **kwargs) #2.1处理版本信息 #versi ...
- Django REST framework版本控制
参考链接:https://www.cnblogs.com/liwenzhou/p/10269268.html 1.路由: #版本控制 re_path('^(?P<version>[v1|v ...
- Django REST framework中的版本控制
1.REST framework版本控制的流程分析 1.1 determine_version方法的执行流程 首先,请求到达REST framework的CBV,执行CBV中的dispatch方法再次 ...
- Django REST Framework API Guide 06
本节大纲 1.Validators 2.Authentication Validators 在REST框架中处理验证的大多数时间,您将仅仅依赖于缺省字段验证,或在序列化器或字段类上编写显式验证方法.但 ...
- Django REST framework反向生成url
Django REST framework是一个基于Django的框架,REST framework又是怎么反向生成url的呢?? 在前面的例子中,知道在REST framework中有6种版本控制的 ...
- django rest framework restful 规范
内容回顾: . django请求生命周期 -> 执行遵循wsgi协议的模块(socket服务端) -> 中间件(路由匹配) -> 视图函数(业务处理:ORM.模板渲染) -> ...
- Django Rest Framework源码剖析(四)-----API版本
一.简介 在我们给外部提供的API中,可会存在多个版本,不同的版本可能对应的功能不同,所以这时候版本使用就显得尤为重要,django rest framework也为我们提供了多种版本使用方法. 二. ...
- Django Rest FrameWork 全部API
Django Rest FrameWork .Requests 请求 客服端发送给服务器的请求 .Responses 响应 rest框架支持响应不同格式的内容 .Views 视图 base基础类视图 ...
随机推荐
- IO通信模型(二)同步非阻塞模式NIO(NonBlocking IO)
同步非阻塞模式(NonBlocking IO) 在非阻塞模式中,发出Socket的accept()和read()操作时,如果内核中的数据还没有准备好,那么它并不会阻塞用户进程,而是立刻返回一个信息.也 ...
- C#简单委托示例——让你一看就会的demo
委托 1. 什么是委托? 委托就是具有相同签名和返回值类型的有序方法列表 它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递 是一种引用类型 方法的列表称为调用列表 当委托被调用时,它调 ...
- C# 判断用户是否对路径拥有访问权限
如何获取当前系统用户对文件/文件夹的操作权限? 1.获取安全信息DirectorySecurity DirectorySecurity fileAcl = Directory.GetAccessCon ...
- C#杂记-隐式类型的局部变量
基础知识:方法中声明的变量,叫局部变量 普通局部变量:有明确数据类型. string name; 隐式类型的局部变量:使用“var”代替明确的数据类型. var name = "abc&qu ...
- Android项目刮刮奖详解扩展篇——开源刮刮奖View的制作
Android项目刮刮奖详解(四) 前言 我们已经成功实现了刮刮奖的功能了,本期是扩展篇,我们把这个View直接定义成开源控件,发布到JitPack上,以后有需要也可以直接使用,关于自定义控件的知识, ...
- Yii2基本概念之——配置(Configurations)
在Yii中创建新对象或者初始化已经存在的对象广泛的使用配置,配置通常包含被创建对象的类名和一组将要赋值给对象的属性的初始值,这里的属性是Yii2的属性.还可以在对象的事件上绑定事件处理器,或者将行为附 ...
- [总结]WEB前端开发常用的CSS/CSS3知识点
css3新单位vw.vh.vmin.vmax vh: 相对于视窗的高度, 视窗被均分为100单位的vh; vw: 相对于视窗的宽度, 视窗被均分为100单位的vw; vmax: 相对于视窗的宽度或高度 ...
- ccflow表机构与运行机制(二次开发必看)
驰骋工作流引擎,工作流程管理系统,表结构与运行机制. ------------------------------------------------------- 前言: 1, ccflow 有自动 ...
- Vue2开发大全
参考资料: vuex element qs.js axios.js vue promise 关于ES6的Promise的使用深入理解 vue2 设置网页title的问题 Mint UI websto ...
- log4j详细配置
参考博客:https://blog.csdn.net/sinat_30185177/article/details/73550377 log4j..很简单好用的一个记录日志的东东,正因为好用,本人从来 ...