DRF版本控制组件

- 版本控制:

“对接口进行版本控制只是一种杀死已部署客户端的‘礼貌’方式。”    - 罗伊菲尔丁。

API版本控制允许 更改不同客户端之间的行为;
版本控制由传入的客户端请求确定,可以基于请求URL,也可以基于请求标头。

 

- 自定义版本控制前的源码分析:

  - 初始化 

    - 在APIViews.dispatch方法中,DRF在Request被封装好后,执行了一个初始化的函数 self.initial() ,在该函数中实例化了四个对象:

    - 源码:

      - APIViews.dispatch():

Django Rest Framework 版本 、认证、权限以及限流组件

 

      - APIViews.initial()

Django Rest Framework 版本 、认证、权限以及限流组件

         - 注释1,应该是 实例化版本控制 (图片内容错误);

 

  - 在版本控制中,返回了两个对象,一个是版本号,一个是版本控制的实例化对象;

    - determine_version()

Django Rest Framework 版本 、认证、权限以及限流组件

 

    - api_settings:  将DEFAULT_VERSIONING_CLASS 对应的值改成自定义的类,即可启用 版本控制;

Django Rest Framework 版本 、认证、权限以及限流组件

 

 - 自定义版本控制:

  - 配置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.
AcceptHeaderVersioning

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2019-09-29
  • 2021-11-20
  • 2022-12-23
  • 2020-07-23
  • 2021-06-21
猜你喜欢
  • 2022-12-23
  • 2019-01-16
  • 2022-12-23
  • 2021-12-10
  • 2022-01-11
  • 2022-12-23
相关资源
相似解决方案