【问题标题】:Having a 404 for each site in a Wagtail multisite setupWagtail 多站点设置中的每个站点都有一个 404
【发布时间】:2019-06-04 18:04:48
【问题描述】:

我正在尝试让两个不同的 Wagtail 站点拥有自己的 404 页面,但似乎没有办法在 wagtail“设置”的“站点”配置中指定将哪个页面用作 404 页面=>“站点”部分,当我将它们放入相关的应用程序目录时,我似乎无法加载正确的 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)

所以在INSTALLED_APPS 我们有:

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

  'apps.mainsite',
  'apps.spinoff',
]

在此,主站点包含所有页面类型的大部分,而在不同域上运行的衍生站点通过从apps.mainsite 导入这些页面类型来使用这些页面类型

在 Wagtail 中,我们有两个以 root 身份工作的页面:Homepagemainsite 页面类型,Spinoff Homepagespinof 页面类型,继承自主站点的页面类型。

在站点设置中,我们有一个站点条目指向mainsite.com,主Homepage 设置为根,另一个站点条目指向spinoff.com,衍生主页设置为根。

对于这两个网站,不存在的 url 请求会导致主站点的 404.html 被使用,所以问题是:我们如何使衍生域上不存在的 url 解析为衍生域的 404.html代替?

【问题讨论】:

  • 作为参考,已针对此问题提出了一个问题,因为它似乎在文档中丢失。 github.com/wagtail/wagtail/issues/5360
  • 那个参考是我:我提交了那个,在这个问题在通常的时间里没有得到答案之后 wagtail 问题做 =)
  • 是的,要找到一个可靠的解决方案有点棘手,我在 Github 问题上添加了一些注释。虽然不确定文档是否是一个解决方案,也许是一个简单的方法(如下面 Dan 的解决方案),但它可能需要增强代码以使这种事情更容易开箱即用。
  • 鹡鸰文档在给出示例方面相当不错,因此对于专门的“使用多站点设置时需要考虑的事项”文本,一个具体的示例肯定是有用且合适的。当然,理想的解决方案是您在 sites 设置中自行设置:选择一个根页面选择一个 404 页面。

标签: wagtail


【解决方案1】:

由于 Wagtail 是基于 Django 构建的,因此您可以 customize the error view。 Wagtail 的core.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))

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

【讨论】:

  • 不,因为 wagtail 站点可以是任何页面类型的混合:相同的模型可用于创建两个不同的页面,定义两个不同的站点,因此您不能将该处理程序添加到模型,你也不能将它添加到 url 模式中,因为 Wagtail 管理并自动生成它自己的所有 url。
  • 我在回答中添加了更多细节。请再看一遍,并希望重新考虑否决票。
  • 根据赏金:你能把它变成一个针对 wagtail 的文档 repo 的文档 PR 吗?因为 wagtail 不使用 views.py 文件,也不使用基本 urls.py 之外的 urls.py,所以这种解释依赖于人们理解在您使用 wagtail 时不适用的概念(即使在引擎盖下,他们也会这样做)。
  • 我会很高兴(我非常重视良好的文档,并且在 Wagtail 文档中批准了相当数量的小型拉取请求)。希望 Wagtail 的维护者会批准这个 PR。需要记住的一件事——Wagtail 维护者不想在他们的文档中看到重复的 Django 文档,所以我的 PR 将在适当的地方引用 Django 文档——但我将解释在应用程序中创建 views.py 文件的必要性.我计划今晚提交 PR。
  • 我已提交 PR 以在 Wagtail 文档中涵盖此解决方案:github.com/wagtail/wagtail/pull/5375。关于您选择根页面 404 页面的想法,我对Wagtail 完全多租户非常感兴趣。为此,我开始使用 themes 文件夹。 themes 文件夹位于项目的第一级,其中包含文件夹,每个文件夹都包含特定主题的所有资产。在我的理想世界中,您会将主题与网站相关联。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 2010-11-25
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多