Django REST框架Browsable API的不同版本管理方案

5

我有一个对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豁免?
1个回答

0

您可以更改默认版本控制类以为来自浏览器的请求分配版本。浏览器请求的媒体类型应为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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接