【问题标题】:Django Wagtail pageurl template tag returning incorrect host nameDjango Wagtail pageurl 模板标签返回不正确的主机名
【发布时间】:2017-01-27 18:11:29
【问题描述】:

我在博客索引页面上使用 Wagtail 1.8pageurl 模板标签将博客的标题超链接到实际的博客页面。很标准的东西。这是一个 Django 1.10 项目。

<a class="blog-post-link" href="{% pageurl blog %}">
    <h2>{{ blog.title }}</h2>
</a>

我遇到的一个非常奇怪的问题是,站点的主机名被替换为托管该站点的服务器的主机名。例如,正确的链接是:

https://beadtrails.com/blog/vernon-bc-what-to-do-on-and-off-the-trails/

但是,它有时会返回为https://graphicearth.ca/blog/vernon-bc-what-to-do-on-and-off-the-trails/

当我说有时,如果我去 wagtail 管理站点页面,然后进入主机记录并保存它,它会解决问题 - 一段时间。然后它将恢复到不正确的 url。

您可以想象,如果您的博客链接以 404 错误结尾,这并不是一个很好的情况!

为了解决问题,我检查了 Wagtail 和 Django 站点表的配置,检查了配置文件是否正确识别 SITE_ID,对“graphicearth.ca”的所有源代码进行了文本搜索,查看了 uWSGI 和nginx 配置文件,检查 Wagtail 中相对于主页的博客层次结构是否正确,检查浏览器中的标题以确保传递了正确的主机。一切看起来都不错。

挖掘模板标签的源代码,在 wagtailcore_tags.py 中,函数的 cmets 说:

如果页面的 URL 位于相同的范围内,则将其输出为相对 (/foo/bar/) 站点作为当前页面,或者绝对 (http://example.com/foo/bar/) 如果 不是。

因此,出于某种原因,代码最终会认为站点是不同的——但并非总是如此。如上所述,如果我进入 Wagtail 管理员并重新保存站点条目,它会修复一段时间。

由于这是在生产系统上,因此很难调试。是否有人对可能导致此问题的原因和/或如何调试有任何建议?

应用程序堆栈是: - Django 1.10.5 - 鹡鸰 1.8 - uWSGI - nginx

答案更新: 汤姆的回答让我找到了解决方案,所以我将他的回答标记为正确。我为多个站点使用了相同的 memcached 实例,并且密钥必须被交叉。我恢复到基本的 django 缓存,它解决了问题。是时候为同一服务器上的多个站点寻找更好的缓存解决方案了。

【问题讨论】:

    标签: django uwsgi wagtail


    【解决方案1】:

    您是否在生产系统上配置了缓存? pageurl 模板标签调用get_site_root_paths(),它使用站点根路径的缓存(如果有的话)。如果网站被编辑或删除,缓存应该被清除,但也许您可以尝试configuring settings.CACHES to use DummyCache 来帮助追踪问题。

    【讨论】:

    • 作为对此的后续思考 - graphicsearth.ca 是同一服务器上的另一个 Wagtail 实例吗?它们可能共享相同的缓存,并且wagtail_site_root_paths 键在两个安装之间发生冲突。如果是这样,最简单的解决方法是添加 KEY_PREFIX: docs.djangoproject.com/en/1.10/topics/cache/…
    • 是的,这似乎是缓存的问题——我正在运行 memcached。仍在追踪确切的修复程序,并在我确定它稳定时发布更新。谢谢你的回答。
    猜你喜欢
    • 2017-05-21
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 2013-09-22
    • 2012-12-24
    • 2014-10-17
    相关资源
    最近更新 更多