【问题标题】:WSGI Process won't reload after changing the wsgi script file更改 wsgi 脚本文件后,WSGI 进程不会重新加载
【发布时间】:2013-08-07 07:20:15
【问题描述】:

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

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

我尝试了以下两种方法从 web-app 代码中“触摸”文件,但都不起作用:

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

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

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

【问题讨论】:

    标签: django apache mod-wsgi


    【解决方案1】:

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

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

    更多细节和其他触发重载的方式见:

    【讨论】:

    • 谢谢,现在很明显 WSGI 进程正在重新加载,但问题出在语言环境初始化中。仍然很有趣的问题,因为我发现如果我在 WSGI 进程启动后的第一个请求-响应周期中更改默认语言环境(使用 translate.activate() 调用),它将永远保持更改 - 直到下一个进程重新加载。奇怪...
    【解决方案2】:

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

    更多信息在这里:set language within a django view

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 2012-10-13
      • 2015-03-08
      • 2010-11-07
      • 2021-11-28
      • 1970-01-01
      • 2014-03-18
      • 2020-05-17
      相关资源
      最近更新 更多