Ed *_*d I 5 python django django-rest-framework
我对 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',
),
}
Run Code Online (Sandbox Code Playgroud)
这很好用,但是我失去了使用可浏览的 API 渲染器的能力:
HTTP 406 Not Acceptable
Allow: GET
Content-Type: application/vnd.acme+json
Vary: Accept
{
"detail": "Invalid version in \"Accept\" header."
}
Run Code Online (Sandbox Code Playgroud)
我想指定,如果对可浏览的 API 发出请求,则默认版本应为 2.0。原因是,在尝试可浏览的 API 时,默认版本应该是最新版本,但是当以编程方式使用 API 时,用户不应该因为忽略指定其版本而暴露于重大更改。
如何使我的 API 需要版本,但允许可浏览的 API 豁免?
您可以更改默认版本控制类以将版本分配给来自浏览器的请求。浏览器要求的媒体类型应该是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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
740 次 |
| 最近记录: |