我正在使用django-rest-framework。它提供了一个很棒的Django管理风格的可浏览的自文档API。但是任何人都可以访问这些页面并使用接口添加数据(POST)。我如何禁用它?
当前回答
# For Production Only
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
只要把这个添加到你的settings.py就会禁用Browsable API!
其他回答
您只需要从视图支持的呈现器列表中删除可浏览的API呈现器。
一般来说:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
阅览基础:
class MyView(...):
renderer_classes = [renderers.JSONRenderer]
旁白:
在许多情况下,我认为人们在任何情况下都选择禁用可浏览API是一种遗憾,因为它对任何开发API的人员都有很大的帮助,并且它没有给予他们更多的权限,否则他们将拥有更多的权限。我知道在某些情况下这样做可能有商业原因,但一般来说,我认为这是一笔巨大的资产。不过,在某些情况下,可能会显示一些非公共API可能不希望公开的细节(如自定义操作的名称)。
关于限制可浏览API呈现器用于开发的更多细节,请参见下面的回答。
虽然对这个问题的公认答案确实回答了问题的措辞,但我觉得它并没有解决手头的实际问题。
为了完整地回答这个问题,禁用可浏览的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中删除表单,因为它响应权限。当经过身份验证的用户登录时,表单将再次可用。
奖金轮:
只在开发中启用可浏览的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
}
在settings.py中,你可以像这样包含一个DEBUG标志:
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。
# For Production Only
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
)
}
只要把这个添加到你的settings.py就会禁用Browsable API!
推荐文章
- 在Django模型中存储电话号码的最佳方法是什么?
- 如何禁用django-rest-framework的管理风格的可浏览界面?
- 如何获取请求。Django-Rest-Framework序列化器中的用户?
- 如何在Django模板中获得我的网站的域名?
- 在django Forms中定义css类
- 我应该在.gitignore文件中添加Django迁移文件吗?
- SQLAlchemy是否有与Django的get_or_create等价的函数?
- 如何选择一个记录和更新它,与一个单一的查询集在Django?
- Django REST框架:向ModelSerializer添加额外字段
- 如何在django上自动化createsuperuser ?
- 如何将Django QuerySet转换为列表?
- 如何直接从测试驱动程序调用自定义的Django manage.py命令?
- 在Python Django中运行单元测试时,如何禁用日志记录?
- Django CSRF检查Ajax POST请求失败
- 如何重命名一个模型字段使用南方?