Wagtail API v2 django.template.exceptions.TemplateDoesNotExist

问题描述 投票:0回答:1

我已经配置了 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 doc说明如下:

可选您可能还想添加 rest_framework已安装的应用程序. 这将使API在从Web浏览器查看时可以浏览,但对于基本的JSON格式化的输出来说是不需要的。

这倒是真的,因为API在通过 curl然而,如果我不添加 rest_frameworkINSTALLED_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 在我的prod网站设置中,是一个强制性的应用程序吗?我是不是错过了一些配置细节?解决这个问题的最好方法是什么?

我不希望我的直播网站会一直抛出500,而且我也不严格需要这个漂亮而闪亮的api接口。


EDIT

添加了相关 rest_framework 配置。

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": [
        "rest_framework.permissions.IsAuthenticatedOrReadOnly",
    ],
    "DEFAULT_RENDERER_CLASSES": [
        "rest_framework.renderers.JSONRenderer",
    ],
}

EDIT:

通过查看调试回溯,好像是 Wagtail 是以某种方式执行 rest_framework.renderers.BrowsableAPIRenderer 渲染器,即使 REST_FRAMEWORK 是没有配置使用它?

enter image description hereenter image description here

EDIT:

显然 Wagtail 实在是无视 REST_FRAMEWORK 设置,而是使用硬编码的 渲染器_classes 哪些 [JSONRenderer, BrowsableAPIRenderer].

python django django-rest-framework wagtail wagtail-apiv2
1个回答
0
投票

这是因为 rest_framework 拥有 TemplateHTMLRenderer 作为默认的渲染器之一。

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
       'rest_framework.renderers.JSONRenderer',
       'rest_framework.renderers.TemplateHTMLRenderer',
    ],
   ...
}

而它要想渲染模板,就必须使用Django模板工具来定位模板。而为了让该工具搜索到模板,在 rest_framework 包,它必须被添加到 INSTALED_APPS.

因此,为了解决这个问题,覆盖了 REST_FRAMEWORK 的设置,并删除该 TemplateHTMLRenderer 因为你只需要 JSONRenderer.你可以阅读更多关于 DRF设置.


0
投票

潜在的是,这是一个 虫子 在...中 Wagtail 因为它忽略了 REST_FRAMEWORK 设置中的配置,而是使用硬编码的 渲染器_classes 目前是 [JSONRenderer, BrowsableAPIRenderer].

为了解决这个问题,可以设置 Wagtail API 像以下这些:

from django.conf import settings
from wagtail.api.v2.views import PagesAPIViewSet
from wagtail.api.v2.router import WagtailAPIRouter

if not settings.DEBUG:
    from rest_framework.renderers import JSONRenderer

    class ProdPagesAPIViewSet(PagesAPIViewSet):
        renderer_classes = [JSONRenderer]

    PagesAPIViewSet = ProdPagesAPIViewSet

api_router = WagtailAPIRouter("wagtailapi")  
api_router.register_endpoint("p", PagesAPIViewSet)
© www.soinside.com 2019 - 2024. All rights reserved.