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

iFo*_*sts 138 django django-rest-framework

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

Tom*_*tie 223

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

您可以这样全局地执行此操作:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}
Run Code Online (Sandbox Code Playgroud)

或者在每个视图的基础上如下:

class MyView(...):
    renderer_classes = [renderers.JSONRenderer]
Run Code Online (Sandbox Code Playgroud)

旁白:在很多情况下,我认为人们会选择在任何情况下禁用可浏览的API,这是一种耻辱,因为它对任何使用API​​的开发人员都有很大的帮助,而且它没有给予他们更多的权限,否则他们会拥有.我可以看到在某些情况下这样做可能有商业原因,但一般来说我认为这是一项巨大的资产.

  • "这对任何从事API工作的开发人员来说都是一个很大的帮助." 他们不应该有开发和生产的设置文件吗?在开发中启用可浏览的API. (25认同)
  • @JacobValenta我认为*Tom Christie意味着使用您的API的第三方开发人员应该能够使用可浏览的API. (9认同)
  • @TomChristie Tom,在我的案例中,视图级别权限阻止未经授权的用户在可浏览的api中看到401以外的任何内容,但Users视图除外,因为我允许未经授权的POST创建新用户.这会导致HTML表单显示我不想公开的自动完成数据.是否有一种简单的方法可以防止未经授权的用户制作自定义模板? (6认同)
  • 是的,根据@DustinWyatt (2认同)

Rou*_*tor 55

虽然这个问题的公认答案确实回答了问题,但我觉得它并没有解决手头的实际问题.

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

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.JSONRenderer',
    )
}
Run Code Online (Sandbox Code Playgroud)

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

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

除非用户通过身份验证,否则以下内容将设置所有端点为只读.

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticatedOrReadOnly',
    )
}
Run Code Online (Sandbox Code Playgroud)

如果您希望完全隐藏API,除非用户已登录,您也可以使用IsAuthenticated.

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

奖金回合:

仅在开发中启用可浏览的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
}
Run Code Online (Sandbox Code Playgroud)

  • 这更直接地回答了问题而不是被接受的,最受欢迎的答案. (5认同)
  • 如果您为本地和生产保留单独的配置文件,则可以将其放入 local.py 设置文件中(只需确保将上述内容从元组更改为列表): `REST_FRAMEWORK['DEFAULT_RENDERER_CLASSES'].append(' rest_framework.renderers.BrowsableAPIRenderer')` (2认同)

Sye*_*zan 10

 # For Production Only
 REST_FRAMEWORK = {
     'DEFAULT_RENDERER_CLASSES': (
         'rest_framework.renderers.JSONRenderer',
     )
 }
Run Code Online (Sandbox Code Playgroud)

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