我正在使用django-rest-framework。它提供了一个很棒的Django管理风格的可浏览自文档API。但是任何人都可以访问这些页面并使用界面添加数据(POST)。我如何禁用它?
h79rfbju1#
您只需要从视图支持的渲染器列表中删除可浏览的API渲染器。
一般情况:
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework.renderers.JSONRenderer', ) }
基于每个视图:
class MyView(...): renderer_classes = [renderers.JSONRenderer]
"旁白“:在许多情况下,我认为人们选择禁用可浏览的API是一种耻辱,因为它对任何开发API的开发人员都有很大的帮助,而且它 * 并没有给他们更多的权限,否则他们将拥有 *。我可以看到,在 * 某些 * 情况下这样做可能有业务原因,但通常我会认为它是一项巨大的资产。尽管如此,在某些情况下,可能会显示非公共API不希望公开的详细信息(如自定义操作的名称)。另请参阅下面的答案,了解有关将可浏览API渲染器限制为开发的更多详细信息。
zysjyyx42#
虽然这个问题的公认答案确实回答了这个问题,因为它的措辞,我觉得它没有解决手头的实际问题。为了完整起见,禁用可浏览的HTML API的方法是将其从呈现器类中删除,如下所示:
然而,这个问题所暗示的实际问题是人们可以在没有身份验证的情况下向API发帖。虽然删除表单会使它不那么明显,但这个答案并不能保护API端点。至少,有人发现了这个问题,并希望保护API免受未经身份验证或未经授权的POST提交;他们希望改变API Permissions以下代码将所有终结点设置为只读,除非用户经过身份验证。
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticatedOrReadOnly', ) }
如果您希望在用户登录之前完全隐藏API,也可以使用IsAuthenticated。仅供参考:此操作还将从HTML可浏览API中删除表单,因为它会响应权限。当经过身份验证的用户登录时,表单将再次可用。
IsAuthenticated
奖励回合:
仅在开发中启用可浏览的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 }
uxhixvfz3#
# For Production Only REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ( 'rest_framework.renderers.JSONRenderer', ) }
只需将此添加到您的settings.py应禁用可浏览的API!
pkwftd7m4#
在settings.py中,您可以包含DEBUG标志,如下所示:
settings.py
DEBUG = env.bool("API_DEBUG", default=True)
然后,如果DEBUG设置为True或False,则可以基于该标志设置渲染行为:
if DEBUG: DEFAULT_RENDERER_CLASSES = ( "rest_framework.renderers.JSONRenderer", "rest_framework.renderers.BrowsableAPIRenderer", ) else: DEFAULT_RENDERER_CLASSES = ( "rest_framework.renderers.JSONRenderer", ) REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': DEFAULT_RENDERER_CLASSES, }
这样,只要API处于调试模式,它就会显示可浏览的API,而当它不处于调试模式时,它只会呈现JSON。
4条答案
按热度按时间h79rfbju1#
您只需要从视图支持的渲染器列表中删除可浏览的API渲染器。
一般情况:
基于每个视图:
"旁白“:
在许多情况下,我认为人们选择禁用可浏览的API是一种耻辱,因为它对任何开发API的开发人员都有很大的帮助,而且它 * 并没有给他们更多的权限,否则他们将拥有 *。我可以看到,在 * 某些 * 情况下这样做可能有业务原因,但通常我会认为它是一项巨大的资产。尽管如此,在某些情况下,可能会显示非公共API不希望公开的详细信息(如自定义操作的名称)。
另请参阅下面的答案,了解有关将可浏览API渲染器限制为开发的更多详细信息。
zysjyyx42#
虽然这个问题的公认答案确实回答了这个问题,因为它的措辞,我觉得它没有解决手头的实际问题。
为了完整起见,禁用可浏览的HTML API的方法是将其从呈现器类中删除,如下所示:
然而,这个问题所暗示的实际问题是人们可以在没有身份验证的情况下向API发帖。虽然删除表单会使它不那么明显,但这个答案并不能保护API端点。
至少,有人发现了这个问题,并希望保护API免受未经身份验证或未经授权的POST提交;他们希望改变API Permissions
以下代码将所有终结点设置为只读,除非用户经过身份验证。
如果您希望在用户登录之前完全隐藏API,也可以使用
IsAuthenticated
。仅供参考:此操作还将从HTML可浏览API中删除表单,因为它会响应权限。当经过身份验证的用户登录时,表单将再次可用。
奖励回合:
仅在开发中启用可浏览的HTML API:
uxhixvfz3#
只需将此添加到您的settings.py应禁用可浏览的API!
pkwftd7m4#
在
settings.py
中,您可以包含DEBUG标志,如下所示:然后,如果DEBUG设置为True或False,则可以基于该标志设置渲染行为:
这样,只要API处于调试模式,它就会显示可浏览的API,而当它不处于调试模式时,它只会呈现JSON。