【问题标题】:Different versioning scheme for Django REST Framework Browsable APIDjango REST Framework 可浏览 API 的不同版本控制方案
【发布时间】:2016-11-03 15:53:58
【问题描述】:

我需要一个不允许默认版本的 API。所有客户端都需要明确指定任何资源的版本。我通过以下配置实现了这一点:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.ext.rest_framework.OAuth2Authentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning',
    'ALLOWED_VERSIONS': ['2.0'],
    'DEFAULT_RENDERER_CLASSES': (
        'api.renderers.CustomJSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',
    ),
}

这很好用,但是我只是失去了使用可浏览 API 渲染器的能力:

HTTP 406 Not Acceptable
Allow: GET
Content-Type: application/vnd.acme+json
Vary: Accept

{
    "detail": "Invalid version in \"Accept\" header."
}

我想指定如果向可浏览 API 发出请求,则默认版本应为 2.0。原因是,在试验可浏览 API 时,默认值应该是最新版本,但在以编程方式使用 API 时,用户不应因为忽略指定版本而面临重大更改。

我怎样才能让我的 API 需要一个版本,但允许可浏览的 API 被豁免?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您可以更改默认版本控制类以将版本分配给来自浏览器的请求。浏览器要求的媒体类型应该是text/html,而普通的API调用会要求application/json。

    from rest_framework.versioning import AcceptHeaderVersioning
    
    class BrowserableAcceptHeaderVersioning(AcceptHeaderVersioning):
        def determine_version(self, request, *args, **kwargs):  
            if request.accepted_media_type == 'text/html':  
                return 'browser' 
            return super().determine_version(request, *args, **kwargs)
    

    【讨论】:

      猜你喜欢
      • 2012-12-25
      • 2016-03-31
      • 1970-01-01
      • 2022-10-03
      • 1970-01-01
      • 2023-03-09
      • 2015-04-28
      • 2016-03-24
      • 2013-12-27
      相关资源
      最近更新 更多