如何禁用django-rest-framework的admin样式可浏览界面?


150

我正在使用django-rest-framework。它提供了一个很棒的Django admin样式可浏览的自我记录API。但是任何人都可以访问这些页面并使用该界面添加数据(POST)。如何禁用它?


是的,用户可以登录并使用API​​。但我不想向他们显示管理员样式的可浏览页面。
iForests 2012年

Answers:


246

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

通常:

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

每次观看的基础:

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

除了

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

另请参阅以下答案,以获取有关限制可浏览API渲染器进行开发的更多详细信息。


31
it's a big aid to any developers working on the API。他们不应该有用于开发和生产的设置文件吗?在开发中启用可浏览的API。
雅各布·瓦伦塔

11
@JacobValenta我认为 Tom Christie表示使用您的API的第三方开发人员应该能够使用可浏览的API。
达斯汀·怀亚特

1
是的,根据@DustinWyatt
Tom Christie

7
@TomChristie Tom,在我的情况下,视图级别权限可防止未经授权的用户在可浏览的api中看到除401之外的其他内容,但“用户”视图除外,因为我允许未经授权的POST创建新用户。这将导致HTML表单与我不想公开的自动完成的数据一起显示。除了制作自定义模板之外,是否有一种简便的方法可以防止未经授权的用户这样做?
jeffjv

1
只是想我会添加很多或大多数政府客户,明确要求完全禁用发现方法(例如可浏览的REST API接口)。我并不是说这是有意义的,或者它是正确的。
Ray Pendergraph,2015年

73

虽然这个问题的公认答案确实回答了措辞上的问题,但我认为它不能解决眼前的实际问题。

为了完整起见,禁用可浏览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
}

7
这比公认的,建议最多的答案更直接地回答了问题。
乌龟很可爱

如果您为本地和生产保留单独的配置文件,则可以将其放在local.py设置文件中(只需确保将以上内容从元组更改为列表):REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES'].append('rest_framework.renderers.BrowsableAPIRenderer')
getup8

2
import rest_framework

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

只要将此添加到您的Settings.py中,就应该禁用可浏览的API!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.