API版本控制可以用来在不同的客户端使用不同的行为。REST框架提供了大量不同的版本设计。

版本控制是由传入的客户端请求决定的,并且可基于请求URL,或者基于请求头。

rest_framework

当使用版本控制时,request.version属性(字符串)与客户端请求的版本一致。

默认情况下,没有使用版本控制,request.version将会返回None

 versioning_class = api_settings.DEFAULT_VERSIONING_CLASS

    # APIView
def initial(self, request, *args, **kwargs):
"""
Runs anything that needs to occur prior to calling the method handler.
"""
self.format_kwarg = self.get_format_suffix(**kwargs) # Perform content negotiation and store the accepted info on the request
neg = self.perform_content_negotiation(request)
request.accepted_renderer, request.accepted_media_type = neg # Determine the API version, if versioning is in use.
version, scheme = self.determine_version(request, *args, **kwargs)
request.version, request.versioning_scheme = version, scheme def determine_version(self, request, *args, **kwargs):
"""
If versioning is being used, then determine any API version for the
incoming request. Returns a two-tuple of (version, versioning_scheme)
"""
if self.versioning_class is None:
return (None, None)
scheme = self.versioning_class()
return (scheme.determine_version(request, *args, **kwargs), scheme)

除非明确设置,否则DEFAULT_VERSIONING_CLASS值为None.此例中request.version将会始终返回None

您还可以在一个单独的视图上设置版本控制方案。通常,不需要这样做,因为在全局范围内使用一个版本控制方案更有意义。如果确实需要这样做,请使用versioning_class属性。

from rest_framework.versioning import QueryParameterVersioning

class VersionTestAPI(APIView):

    versioning_class = QueryParameterVersioning

rest_framework .versioning中的5种版本控制方式

class AcceptHeaderVersioning(BaseVersioning):
"""
GET /something/ HTTP/1.1
Host: example.com
Accept: application/json; version=1.0
"""
pass 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
"""
pass class NamespaceVersioning(BaseVersioning):
"""
To the client this is the same style as `URLPathVersioning`.
The difference is in the backend - this implementation uses
Django's URL namespaces to determine the version. An example URL conf that is namespaced into two separate versions # users/urls.py
urlpatterns = [
url(r'^/users/$', users_list, name='users-list'),
url(r'^/users/(?P<pk>[0-9]+)/$', users_detail, name='users-detail')
] # urls.py
urlpatterns = [
url(r'^v1/', include('users.urls', namespace='v1')),
url(r'^v2/', include('users.urls', namespace='v2'))
] GET /1.0/something/ HTTP/1.1
Host: example.com
Accept: application/json
"""
pass class HostNameVersioning(BaseVersioning):
"""
GET /something/ HTTP/1.1
Host: v1.example.com
Accept: application/json
"""
pass class QueryParameterVersioning(BaseVersioning):
"""
GET /something/?version=0.1 HTTP/1.1
Host: example.com
Accept: application/json
"""
pass

以URLPathVersioning为例

  1. setting添加配置
INSTALLED_APPS = [
...
'VersionDemo'
...
] REST_FRAMEWORK = {
'DEFAULT_VERSIONING_CLASS':'rest_framework.versioning.URLPathVersioning',
'ALLOWED_VERSIONS':['v1','v2'], # 允许的版本
'VERSION_PARAM':'version', # 参数 # 1
'DEFAULT_VERSION':'v1', # 默认版本
}

2.url路由配置

urls.py

urlpatterns = [ re_path('api/(?P<version>[v1|v2]+)/', include('api.urls')), name='users-list']  # 2

api/urls.py

urlpatterns = [ path('test/', views.VersionTestView.as_view()),]
  1. 传递版本信息
http://127.0.0.1:8000/api/v1/test/
  1. 获取版本
request.version 				#  获取版本

基于不同版本进行不同的行为

class VersionTestView(APIView):

    def get(self,request,version):      # 3      1,2,3处参数要保持一至,这里均为version
if request.version == 'v2':
return Response({'data':'v2'})
return Response({'data':'v1'})

改变URL,如何反向解析

from rest_framework.reverse import reverse
reverse('users-list', request=request)

reverse函数将应用于转换任何请求版本的URL。

- NamespacedVersioning:类似命名空间

'v1:users-list'

rest_framework框架——版本控制组件的更多相关文章

  1. 【DRF框架】版本控制组件

    DRF框架提供的版本控制组件 核心代码:           version, scheme = self.determine_version(request, *args, **kwargs)req ...

  2. rest-framework框架——版本

    一.DRF版本控制介绍 随着项目更新,版本会越来越多,不能新的版本出现,旧版本就不再使用维护了.因此不同的版本会有不同的处理,且接口会返回不同的信息. API版本控制允许我们在不同的客户端之间更改行为 ...

  3. 前后端分离djangorestframework——版本控制组件

    什么是版本控制 在实际开发中,随着时间的更新迭代,我们维护的项目可能会有很多个版本,所以我们写的API也有很多个版本,但是迭代到高版本,不可能以前的版本就不用了,比如一个手机端的app,不定期发布新版 ...

  4. rest_framework框架

    rest_framework框架的认识 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架. 一  路由 可以通过路由as_view()传参 根据请求方式的不同执行对应不同的方法 ...

  5. DRF Django REST framework 之 路由器与版本控制组件(七)

    路由器 一些Web框架提供了用于自动确定应如何将应用程序的URL映射到处理传入请求的逻辑的功能. 而DRF的路由器组件也提供了一种简单,快速且一致的方式将视图逻辑映射到一组URL上. 路由器组件的使用 ...

  6. iis7下.Net框架版本设置

    转载:http://blog.163.com/fan_yishan/blog/static/47692213201391651229542/ Win7下IIS网站的.Net框架版本设置 步骤/方法 1 ...

  7. ASP.NET在IIS7中如何更改网站的.net framework框架版本

    IIS7安装好以后使用了.net 2.0 framework框架,经过折腾发现如下方法可以更改框架版本,从而可以部署使用其他版本框架开发的网站 方法一:建立网站时设置.net框架版本 方法二:对于已经 ...

  8. PHP RBAC权限控制,基于CI框架(版本3.1.9)

    2018年11月7日更新:目前功能已做到事件级别权限控制,如:后台用户的添加操作.删除操作和保存操作等具体到事件级的操作方法有权限则展示相应的操作菜单,没权限则隐藏相应菜单或提示无权限到目前算是真正做 ...

  9. reverse(两种反向生成url django原生形式和rest_framework中版本的形式)

    reverse(两种反向生成url django原生形式和rest_framework中版本的形式) views.py from django.shortcuts import render,Http ...

随机推荐

  1. jar包更新

    打包新的jar包 java -jar xx.jar 本地测试后 删除旧的jar包 然后要重启jar包

  2. windows串口编程Win32,PComm串口开发

    https://blog.csdn.net/u011430225/article/details/51496456 https://blog.csdn.net/eit520/article/detai ...

  3. gj的zabbix客户端开机自启动设置

    查看是否自启动 配置chkconfig 启动服务

  4. 搭建的一套vue打包方案,方便记录一下

    package.json 配置如下: { "name": "rise-vue", "version": "1.0.0", ...

  5. 查全率(Recall),查准率(Precision),灵敏性(Sensitivity),特异性(Specificity),F1,PR曲线,ROC,AUC的应用场景

    之前介绍了这么多分类模型的性能评价指标(<分类模型的性能评价指标(Classification Model Performance Evaluation Metric)>),那么到底应该选 ...

  6. 京东Java架构师讲解购物车的原理及Java实现

    今天来写一下关于购物车的东西, 这里首先抛出四个问题: 1)用户没登陆用户名和密码,添加商品, 关闭浏览器再打开后 不登录用户名和密码问:购物车商品还在吗? 2)用户登陆了用户名密码,添加商品,关闭浏 ...

  7. Fluent Meshing对称模型形成完整模型

    原视频下载地址:https://pan.baidu.com/s/1i4NZnVZ 密码:ts5a

  8. 美团-2019Q2述职总结

    述职要求: 产品对平台化的规划并不清晰:内部因素:对SaaS平台的理解不够深刻: 对公司相关脚手架,服务搭建相关需要注意的点,有更深入的认识.对做系统服务的关注点有了更深入的理解. 功能权限的话: Q ...

  9. 学生会管理系统(JavaWeb与数据库课程小实践)

    学生会文件管理系统使用说明书 一.流程图: 二.具体使用步骤: 1.管理员操作步骤: (1)登录: 输入用户名和密码,登录. (2)跳入欢迎动画. (3)进入主欢迎界面. (4)从主欢迎界面的学生会成 ...

  10. PostMan Request Export