Django Rest Framework 源码解读( 五)版本流程

这是我参与更文挑战的第17天,活动详情查看: 更文挑战

通过参数传递版本号

a. 通过url路径传参

from rest_framework.versioning import URLPathVersioning
复制代码

b. url中通过GET传参

from rest_framework.versioning import QueryParameterVersioning
复制代码

1 版本的重要性

RESTful 规范中,有关版本的问题,用restful规范做开放接口的时候,用户请求API,系统返回数据。但是难免在系统发展的过程中,不可避免的需要添加新的资源,或者修改现有资源。因此,改动升级必不可少,但是,作为平台开发者,应该知道:一旦你的API开放出去,有人开始用了,平台的任何改动都需要考虑对当前用户的影响。因此,做开放平台,从第一个API的设计就需要开始API的版本控制策略问题,API的版本控制策略就像是开放平台和平台用户之间的长期协议,其设计的好坏将直接决定用户是否使用该平台,或者说用户在使用之后是否会因为某次版本升级直接弃用该平台。

2 在URL路径中传参(推荐使用)

2.1 在settting中定义版本参数

有四个,一个全局的版本功能对象,一个默认的版本,一个允许的版本(如果是不允许的版本,会返回错误),一个传递的参数名称。

REST_FRAMEWORK = {
    "DEFAULT_VERSIONING_CLASS":"rest_framework.versioning.QueryParameterVersioning",  # 设置全局版本功能
    "DEFAULT_VERSION":"v1",             # 默认的版本
    "ALLOWED_VERSIONS":['v1', 'v2'],    # 允许的版本
    "VERSION_PARAM":"version",          # 传递的参数名
}
复制代码

2.2 在urls中定义要传递的版本名称

外层路由做分发

from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path

urlpatterns = [
    url(r'^api/', include('api.urls')),
]

复制代码

2.3 APP层路由实现业务

urlpatterns = [
    re_path(r'^(?P<version>v\d)/users/$', views.UserView.as_view(), name='user'),
]
复制代码

2.4 因为是全局设置,所以视图中不用设置也可以

class UserView(APIView):
    def get(self, request, *args, **kwargs):
        print(request.version)
        print(request.versioning_scheme.reverse(viewname="user", request=request))
        return HttpResponse('用户列表')
复制代码

2.5 效果:

http://127.0.0.1:8000/api/v1/users/ # OK
复制代码
http://127.0.0.1:8000/api/v3/users/

{
    "detail": "Invalid version in URL path."
}
复制代码

3 URL中通过GET传参(不推荐)

3.1 在settting中定义版本参数

有三个,一个默认的版本,一个允许的版本(如果是不允许的版本,会返回错误),一个传递的参数名称。

REST_FRAMEWORK = {
    "DEFAULT_VERSION":"v1",             # 默认的版本
    "ALLOWED_VERSIONS":['v1', 'v2'],    # 允许的版本
    "VERSION_PARAM":"version",          # 传递的参数名
}
复制代码

3.2 在视图views中填入 versioning_class 类参数(request.version是返回的参数结果)

from rest_framework.versioning import QueryParameterVersioning
class Version(APIView):
    versioning_class = QueryParameterVersioning
    def get(self, request, *args, **kwargs):
        print(request.version)                  #返回的版本结果
        print(request.versioning_scheme)    # 版本对象,这里的对象是QueryParameterVersioning
        return JsonResponse({"x":'x'})
复制代码

3.3 结果如图

http://127.0.0.1:8000/api/users/?version=v1
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享