[英]mod_wsgi on Python 3.10 does not update Django templates without Apache restart
我已经使用 Apache 和 mod_wsgi 在 Python 3.8 上运行 Django 服务器一段时间了,我决定是时候升级到 Python 3.10 了。 我在我的服务器上安装了 Python 3.10,安装了 Django 和 mod_wsgi 包,将 mod_wsgi.so 的 3.10 构建复制到 Apache 的模块文件夹,一切都很好......但是,似乎对于这个 mod_wsgi 构建,对模板文件的更改确实除非我重新启动 Apache,否则不会生效。
例如,我向我的网站添加了一个随机的 HTML 模板文件,并使用该模板中的一些初始文本启动了服务器。 在 Python 3.8 上运行,我能够更改该模板的内容(例如echo "More Text" >> test_template.html
),刷新浏览器后新文本将显示。 但是在 3.10 中做同样的测试,新文本不会出现。 我尝试了不同的浏览器会话和硬重新加载,这不是客户端的缓存问题,查看 Apache 访问日志中的响应大小可以确认发送到客户端的数据在 3.8 中发生了变化,但在 3.10 中没有发生变化。
我建立了一个测试服务器来隔离问题,并将其缩小到专门更改 mod_wsgi 构建(这当然会更改 Django 使用的整个 Python 版本)。 仍然,这确认它不应该是 Apache 的缓存设置,或者 Django 模板的任何错误配置,我已经按照此处的步骤确认我正在守护进程模式下运行 mod_wsgi(因为我多年来一直在这个服务器上,这是一个长期存在的服务器,配置似乎没有问题 Python 3.8)。
最后,运行 Django 开发服务器(使用 base manage.py runserver
命令)反映了动态的模板更改,没有问题,并且没有重新启动服务器。 据我所知,这似乎是一个 mod_wsgi 怪癖。
具体Apache | mod_wsgi | Python版本组合如下:
Apache/2.4.41 (Ubuntu) mod_wsgi/4.6.8 Python/3.8
Apache/2.4.41 (Ubuntu) mod_wsgi/4.9.4 Python/3.10
...如 Apache 的 error.log 所报告,确认模块正在按预期加载。
有谁知道这是否是 Python 3.10 版 mod_wsgi 的已知问题? 也许我忘记了一个新设置? 我对 Django 模板的理解是它们应该始终立即反映更改(无需重新启动服务器),但是代码更改需要重新启动(或接触 wsgi.py 脚本); 在此更改之前,我从未需要为模板更改重新启动服务器。 任何帮助表示赞赏-
编辑:刚刚尝试将我的 Python 3.8 版本的 mod_wsgi 升级到相同版本(4.9.4),它仍然可以正常工作,所以有一些关于 Python 3.10 vs 3.8,或另一个安装的 python package。我会继续测试......
我最终在 mod_wsgi github 项目下发表了一篇文章,并将问题追溯到这次提交中 Django 行为的变化
可以在此处找到该帖子的完整详细信息
TL;博士; 是否有一个缓存模板加载器,过去仅在设置DEBUG = False
时启用,但已更新为始终有效。 我不确定为什么我的 Python 3.8 版本没有这个变化,因为我已经将这两个版本升级到最新的 Django 可用版本 (4.6.1),但我的原始安装是几年前的,所以很可能全新安装不会有这个问题。
如果你仍然想像我一样禁用缓存模板,你必须在你的 Django 设置中覆盖模板加载器:
TEMPLATES = [
{
'OPTIONS': {
'loaders': ['django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader']
},
},
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.