DRF版本控制组件
- 版本控制:
“对接口进行版本控制只是一种杀死已部署客户端的‘礼貌’方式。” - 罗伊菲尔丁。
API版本控制允许 更改不同客户端之间的行为;
版本控制由传入的客户端请求确定,可以基于请求URL,也可以基于请求标头。
- 自定义版本控制前的源码分析:
- 初始化
- 在APIViews.dispatch方法中,DRF在Request被封装好后,执行了一个初始化的函数 self.initial() ,在该函数中实例化了四个对象:
- 源码:
- APIViews.dispatch():
- APIViews.initial()
- 注释1,应该是 实例化版本控制 (图片内容错误);
- 在版本控制中,返回了两个对象,一个是版本号,一个是版本控制的实例化对象;
- determine_version()
- api_settings: 将DEFAULT_VERSIONING_CLASS 对应的值改成自定义的类,即可启用 版本控制;
- 自定义版本控制:
- 配置settings.py文件:
REST_FRAMEWORK = {
# util.versioning.MyVersioning 自定义类的文件路径
"DEFAULT_VERSIONING_CLASS": "util.versioning.MyVersioning"
}
- 定义版本管理相关的类:
- 类中必须有 determine_version() 方法;
""" util.versioning.py """ class MyVersioning: def determine_version(self, request, *args, **kwargs): print(111) return "v1"
- DRF自带的五种 权限管理:
- 基于请求头
class AcceptHeaderVersioning(BaseVersioning): """ GET /something/ HTTP/1.1 Host: example.com Accept: application/json; version=1.0 """ invalid_version_message = _('Invalid version in "Accept" header.') def determine_version(self, request, *args, **kwargs): media_type = _MediaType(request.accepted_media_type) version = media_type.params.get(self.version_param, self.default_version) version = unicode_http_header(version) if not self.is_allowed_version(version): raise exceptions.NotAcceptable(self.invalid_version_message) return version # We don't need to implement `reverse`, as the versioning is based # on the `Accept` header, not on the request URL.