【发布时间】:2020-05-22 17:59:07
【问题描述】:
我已经按照docs 的规定配置了Wagtail API,并且在使用curl 时效果很好:
$ curl -LsD- http://127.0.0.1:8080/rest/p/
HTTP/1.1 200 OK
Date: Fri, 22 May 2020 17:33:58 GMT
Server: WSGIServer/0.2 CPython/3.8.2
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, HEAD, OPTIONS
X-Frame-Options: DENY
Content-Length: 433
X-Content-Type-Options: nosniff
{
"meta": {
"total_count": 1
},
"items": [
{
"id": 2,
"meta": {
"type": "wagtailcore.Page",
"detail_url": "http://localhost/rest/p/2/",
"html_url": "http://localhost/",
"slug": "home",
"first_published_at": null
},
"title": "Welcome to your new Wagtail site!"
}
]
}
Wagtail 文档声明如下:
(可选),您可能还想将 rest_framework 添加到 INSTALLED_APPS。这将使 API 在从 Web 浏览器查看时可浏览,但对于基本的 JSON 格式输出不是必需的。
这是真的,因为 API 通过curl 可以正常工作,但是如果我不将rest_framework 添加到INSTALLED_APPS 然后尝试通过浏览器访问相同的网址,我会得到http 500,即因为应用程序抛出异常:
Internal Server Error: /rest/p/
Traceback (most recent call last):
File "/usr/local/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/usr/local/lib/python3.8/site-packages/django/core/handlers/base.py", line 145, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/usr/local/lib/python3.8/site-packages/django/core/handlers/base.py", line 143, in _get_response
response = response.render()
File "/usr/local/lib/python3.8/site-packages/django/template/response.py", line 105, in render
self.content = self.rendered_content
File "/usr/local/lib/python3.8/site-packages/rest_framework/response.py", line 70, in rendered_content
ret = renderer.render(self.data, accepted_media_type, context)
File "/usr/local/lib/python3.8/site-packages/rest_framework/renderers.py", line 723, in render
template = loader.get_template(self.template)
File "/usr/local/lib/python3.8/site-packages/django/template/loader.py", line 19, in get_template
raise TemplateDoesNotExist(template_name, chain=chain)
django.template.exceptions.TemplateDoesNotExist: rest_framework/api.html
所以在我看来,如果我不想用django 例外来堵塞我的电子邮件,那么rest_framework 是我的产品站点设置中的强制性应用程序吗?我错过了一些配置细节吗?解决此问题的最佳方法是什么?
我不希望我的实时网站一直抛出 500,而且我也不需要这个漂亮而闪亮的 api 界面。
编辑:
添加了相关的rest_framework配置:
REST_FRAMEWORK = {
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticatedOrReadOnly",
],
"DEFAULT_RENDERER_CLASSES": [
"rest_framework.renderers.JSONRenderer",
],
}
编辑:
通过查看调试回溯,Wagtail 似乎以某种方式强制执行 rest_framework.renderers.BrowsableAPIRenderer 渲染器,即使 REST_FRAMEWORK 未配置为使用它?
编辑:
显然Wagtail 确实忽略了REST_FRAMEWORK 设置,而是使用硬编码的renderer_classes,即[JSONRenderer, BrowsableAPIRenderer]。
【问题讨论】:
标签: python django django-rest-framework wagtail wagtail-apiv2