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的开发人员都有很大的帮助,而且它没有给予他们更多的权限,否则他们会拥有.我可以看到在某些情况下这样做可能有商业原因,但一般来说我认为这是一项巨大的资产.
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)
Sye*_*zan 10
# For Production Only
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
Run Code Online (Sandbox Code Playgroud)
只需将其添加到您的 settings.py 中即可禁用可浏览 API!