0

我在 Apache2.2 上运行 Django 站点,mod_wsgi 3.3 处于守护进程模式(在 Debian Wheezy 上)。

当我touch wsgi.py在我的 shell 中对我的 WSGI 脚本使用该命令时,该进程被重新加载并且一切正常。但是,当我wsgi.py从 web 应用程序代码修改文件时,修改时间被正确更改(通过检查stat)但 WSGI 进程没有重新启动。在运行 WSGI-daemon 时手动触摸文件时,我使用的是相同的用户帐户。

我已经尝试了以下两种方法来从 web 应用程序代码中“触摸”文件,但这些方法都不起作用:

  1. os.system('touch /abs/path/to/wsgi.py')
  2. 使用 django-rosetta 的 ROSETTA_WSGI_AUTO_RELOAD 设置为我完成这项工作

上述两个选项实际上似乎与我touch从 shell 手动执行时完全一样。他们更新所有访问、修改和更改文件属性(我正在使用 ext4,如果这可能重要的话)。

我知道这真的很奇怪,在我阅读了所有文档之后,我感到绝望。有谁至少知道可能是什么原因?

4

2 回答 2

2

请注意,仅在 Web 应用程序收到下一个请求时才会重新加载。在您触摸 wsgi.py 文件的那一刻,它不是瞬时的。尽管您似乎认为这不是问题,但 Apache 通常也会以特殊用户身份运行,并且无法修改 WSGI 脚本文件,除非您专门设置了允许它的权限。

为了更好地确定发生了什么,请确保在 Apache 配置中将 LogLevel 设置为 info,并查看 mod_wsgi 在 Apache 错误日志中生成的日志消息。

有关触发重新加载的更多详细信息和其他方式,请参阅:

于 2013-08-06T12:03:46.353 回答
1

好吧,终于找到解决办法了。我正在使用自定义中间件更改某些 URL 的区域设置。然而,中间件没有translation.deactivate()在请求(方法)结束时调用,process_response这显然导致了一些奇怪的线程间区域设置选择共享,从而也影响了所有进一步的请求。仅当中间件在进程启动后的第一个请求上更改语言环境时才会发生这种情况。

更多信息:在 django 视图中设置语言

于 2013-08-07T05:30:23.273 回答