Django Rest Framework 限流(下)
在Django进阶篇 Rest framework (三) 中,有关版本的问题,用 restful 规范做开发接口的时候,用户请求 API,系统返回数据。但是难免在系统发展的过程中,不可避免的需要添加新的资源,或者修改现有资源。
因此,改动升级必不可少,但是,作为平台开发者,应该知道:一旦你的 API 开放出去,有人开始用了,平台的任何改动都需要考虑对当前用户的影响。因此,做开放平台,从第一个 API 的设计就需要开始 API 的版本控制策略问题,API 的版本控制策略就像是开放平台和平台用户之间的长期协议,其设计的好坏将直接决定用户是否使用该平台,或者说用户在使用之后是否会因为某次版本升级直接弃用该平台。
<1> 定义版本
怎么定义版本协议,前端后端怎么协调。有以下几种方式:
# 版本为1.0
GET /nothing/ HTTP/1.1
Host: example.com
Accept: application/json; version=1.0
# 版本为1.0
URL: example.com/v1.0/
GET /1.0/nothing/ HTTP/1.1
Host: example.com
Accept: application/json
# 版本为1.0
GET /nothing/ HTTP/1.1
Host: v1.example.com
Accept: application/json
# 版本为1.0
GET /nothing/?version=1.0 HTTP/1.1
Host: example.com
Accept: application/json
<二> 版本参数
在 django rest framework 中,如果没有在配置文件 settings.py 中设置默认的 VERSION_PARAM,即版本参数,drf 会设置默认的参数为 version,并将获取到的 version 的值封装到 request.version 中。
① 请求头中定义
django rest framework 的 request,其实是对原生的 Django 的 HttpRequest 做了一个封装,通过直接获取属性可以获取到请求头中的版本号。
django rest framework 的 request
原生的 Django 的 HttpRequest
请求头的版本和其它请求头信息最终会放到 META 中,因此想要获取版本号可以这样:
# 获取版本号
version = request._request.META.get("version")
② 子域名中定义
像请求头中定义一样,在请求头中也可以直接获取到域名,放到 META 中,因此想要获取版本号可以这样:
host = request._request.META.get("HTTP_HOST")
version = host.split(".")[0]
在 django rest framework 内部也有关于以上两种定义版本的处理方法。