Wagtail多站点设置中的每个站点都有404

Mik*_*ans 6 wagtail

我正在尝试让两个不同的Wagtail网站拥有自己的404页面,但是似乎没有一种方法可以在wagtail“ settings” =>“网站”部分,将它们放入相关的应用程序目录后,似乎无法正确加载404:

codebase/
  ./__init__.py
  ./manage.py
  ./apps/
     ./settings.py
     ./urls.py
     ...
     ./django-app-1/
     ./django-app-2/
     ./templates/
        ./404.html
     ./mainsite/
        ./migrations/
        ./static/
        ./templates/
           ./mainsite/
           ./404.html (this 404 always gets used)
     ./spinoff/
        ./migrations/
        ./static/
        ./templates/
           ./spinoff/
           ./404.html (this file never gets used)
Run Code Online (Sandbox Code Playgroud)

因此,INSTALLED_APPS我们有:

INSTALLED_APPS = [
  ...django apps...
  ...wagtail apps...

  'apps.mainsite',
  'apps.spinoff',
]
Run Code Online (Sandbox Code Playgroud)

在这种情况下,主站点拥有所有页面类型的绝大部分,而在其他域上运行的分支站点则通过从中导入这些页面类型使用它们apps.mainsite

在Wagtail中,我们有两个以root用户身份运行的页面:a HomepagemainsitePage类型,而a Spinoff Homepagespinof从主站点的页面类型继承的Page类型。

在网站设置中,我们有一个网站条目指向mainsite.com,主要Homepage设置为Root,另一个网站条目指向spinoff.com,附带的主页设置为root。

对于这两个网站,不存在的url请求都会导致主站点的404.html被使用,因此问题是:我们如何使分拆域上的不存在的url解析为分拆的404.html?

Dan*_*ain 5

由于 Wagtail 是基于 Django 构建的,因此您可以自定义错误视图。Wagtailcore.view.serve调用core.models.page.route,如果未找到页面路由,则会引发Http404。因此,urls.py您可以输入:

from yourapp.views import custom404_view

handler404 = 'yourapp.views.custom404_view'

并在views.py

from django.http import HttpResponseNotFound

def custom404_view(request, exception):       
    return HttpResponseNotFound('<h1>{}</h1>'.format(request.site))
Run Code Online (Sandbox Code Playgroud)

我上面显示的内容返回 Wagtail 站点,以说明该站点在视图中可用,因此在您的情况下,只需根据该站点有条件地返回 HTML 即可。