193

我正在使用django-rest-framework。它提供了一个很棒的 Django 管理风格的可浏览自文档 API。但是任何人都可以访问这些页面并使用该界面添加数据(POST)。我怎样才能禁用它?

4

3 回答 3

303

您只需从视图支持的渲染器列表中删除可浏览的 API 渲染器。

一般来说:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}

每次观看的基础:

class MyView(...):
    renderer_classes = [renderers.JSONRenderer]

旁白

在许多情况下,我认为人们在任何情况下都选择禁用可浏览 API 是一种耻辱,因为这对任何使用 API 的开发人员来说都是一个很大的帮助,而且它并没有给他们更多的权限,否则他们将拥有. 我可以看到在某些情况下这样做可能有商业原因,但通常我认为这是一项巨大的资产。尽管在某些情况下,可能会显示非公共 API 可能不想公开的详细信息(例如自定义操作的名称)。

有关将可浏览 API 渲染器限制为开发的更多详细信息,另请参阅下面的答案。

于 2012-10-31T10:56:36.537 回答
131

虽然这个问题的公认答案确实按照措辞回答了这个问题,但我觉得它并不能解决手头的实际问题。

为了这个答案的完整性,禁用可浏览的 HTML api 是通过从渲染器类中删除它来完成的,如下所示:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}

但是,该问题所暗示的实际问题是人们无需身份验证即可发布到 API。虽然删除表单使其不那么明显,但此答案并不能保护 API 端点。

至少,有人发现了这个问题,并希望保护 API 免受未经身份验证或未经授权的 POST 提交;正在寻求更改API 权限

以下将所有端点设置为只读,除非用户通过身份验证。

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    )
}

如果您想完全隐藏 API,除非用户登录,您还可以使用IsAuthenticated.

仅供参考:这还将在响应权限时从 HTML 可浏览 API 中删除表单。当经过身份验证的用户登录时,表单将再次可用。

奖金回合

仅在 dev 中启用可浏览的 HTML API:

DEFAULT_RENDERER_CLASSES = (
    'rest_framework.renderers.JSONRenderer',
)

if DEBUG:
    DEFAULT_RENDERER_CLASSES = DEFAULT_RENDERER_CLASSES + (
        'rest_framework.renderers.BrowsableAPIRenderer',
    )

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    ),
    'DEFAULT_RENDERER_CLASSES': DEFAULT_RENDERER_CLASSES
}
于 2018-03-20T22:20:43.193 回答
6
 # For Production Only
 REST_FRAMEWORK = {
     'DEFAULT_RENDERER_CLASSES': (
         'rest_framework.renderers.JSONRenderer',
     )
 }

只需将其添加到您的 settings.py 即可禁用 Browsable API!

于 2018-08-02T17:22:42.560 回答