【问题标题】:Target WSGI script '../wsgi.py' cannot be loaded as Python module目标 WSGI 脚本“../wsgi.py”不能作为 Python 模块加载
【发布时间】:2016-09-21 15:27:01
【问题描述】:

我正在部署一个 django 项目并收到 500 错误(请参阅服务器日志错误)。

我哪里做错了?

一些注意事项:

  • centOS
  • 已安装 mod_wsgi
  • 在开发和部署环境中使用相同的 python (2.7) 和 django (1.9.6) 版本
  • 在部署环境中使用 virtualenv

服务器日志错误

[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]  SyntaxError: invalid syntax
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] mod_wsgi (pid=6570): Target WSGI script '/new_esmart/esmart2/esmart2/wsgi.py' cannot be loaded as Python module., referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] mod_wsgi (pid=6570): Exception occurred processing WSGI script '/new_esmart/esmart2/esmart2/wsgi.py'., referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93] Traceback (most recent call last):, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]   File "/new_esmart/esmart2/esmart2/wsgi.py", line 13, in <module>, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]     import django.core.handlers.wsgi, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]   File "/new_esmart/esmart_env/lib/python2.7/site-packages/django/__init__.py", line 1, in <module>, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]     from django.utils.version import get_version, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]   File "/new_esmart/esmart_env/lib/python2.7/site-packages/django/utils/version.py", line 7, in <module>, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]     from django.utils.lru_cache import lru_cache, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]   File "/new_esmart/esmart_env/lib/python2.7/site-packages/django/utils/lru_cache.py", line 28, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]      fasttypes = {int, str, frozenset, type(None)},, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]                      ^, referer: http://192.168.30.17/logistics/alarms/
[Wed Sep 21 17:07:54 2016] [error] [client 192.168.30.93]  SyntaxError: invalid syntax, referer: http://192.168.30.17/logistics/alarms/

wsgi.py

# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('/new_esmart/esmart_env/lib/python2.7/site-packages')

# Add the app's directory to the PYTHONPATH
sys.path.append('/new_esmart/esmart2')
sys.path.append('/new_esmart/esmart2/esmart2')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "esmart2.settings")

# Activate your virtual env
activate_env = os.path.expanduser("/new_esmart/esmart_env/bin/activate_this.py")
execfile(activate_env, dict(__file__=activate_env))

application = django.core.handlers.wsgi.WSGIHandler()

httpd.conf

<VirtualHost *:80>
    ServerAdmin blahblah@blah.it
    DocumentRoot /new_esmart/esmart2
    ServerName logistica.org
    ServerAlias www.logistica.org
    WSGIScriptAlias / /new_esmart/esmart2/esmart2/wsgi.py
    ErrorLog logs/logistica.org-error_log
    CustomLog logs/logistica.org-access_log common
</VirtualHost>

WSGIPythonPath /new_esmart/esmart2:/new_esmart/esmart_env/lib/python2.7/site-packages

/etc/httpd/conf.d/wsgi.conf

LoadModule wsgi_module modules/mod_wsgi.so

【问题讨论】:

  • 虽然您已将 2.7 的库目录添加到 Python 路径,但您实际上并未使用 2.7 版本的 Python。这里有很多问题(其中大部分由 mod_wsgi 的作者回答)告诉您如何将其指向不同的版本。
  • 与您当前的问题无关,但在较新的 Django 版本中,您需要 use get_wsgi_application() 而不是 WSGIHandler()
  • @DanielRoseman 在我的服务器上我在 env 和 virtualenv 中都有相同的 Python 版本(2.7.8)
  • 我不知道在这种情况下“env”是什么,但没关系;您的 mod_wsgi 显然是针对 Python 2.6 运行的。
  • 因为错误中突出显示的 set literal syntax 在 Python 2.6 中无效,但在 2.7 中有效。

标签: django apache virtualenv mod-wsgi wsgi


【解决方案1】:

正如 Daniel 所指出的,该错误表明您的 mod_wsgi 是为 Python 2.6 编译的。为了使用 Python 2.7,您需要安装 mod_wsgi 并针对 Python 2.7 进行编译。您不能通过简单地引用您的 Python 2.7 虚拟环境来尝试强制它使用 Python 2.7,这不是它的工作原理。

您可以使用以下描述的测试应用程序验证使用哪个 Python 版本 mod_wsgi 编译:

您将需要卸载 mod_wsgi 模块并安装为 Python 2.7 构建的版本,如果可用,则从系统包中构建,或者如果没有适用于 Python 2.7 的 mod_wsgi 的系统包,则从源代码构建。

我还建议您查看有关使用 mod_wsgi 的 Django 文档,并确保按照说明使用守护程序模式。

请注意,Django 文档仍未遵循所有最佳实践。与其在python-path 中显式添加site-packages,不如使用python-home 来引用虚拟环境。见:

【讨论】:

    【解决方案2】:

    您没有使用正确的 python 版本,但您可以使用 WSGIPythonHome 指令指定在 apache conf 中使用哪一个。

    添加

    WSGIPythonHome /path/to/your/virtualenv
    

    到你的 Apache 配置,

    这样你就可以在你的 virtualenv 中使用解释器了。

    编辑:

    由于您可能希望专门为您的 VirtualHost 定义 python 主页(WSGIPythonHome 不能在 VirtualHost 范围内使用),您可以使用 WSGIDaemonProcess 指令:

    <VirtualHost *:80>
      ServerName example.com
      [...]
    
      WSGIDaemonProcess example.com python-home=/path/to/venv python-path=<python-path>
      WSGIProcessGroup example.com
    
    </VirtualHost>
    

    【讨论】:

    • 不,这并不完全正确。您只能指向具有相同 X.Y 版本的 Python 安装,然后它应该仍然是与 mod_wsgi 链接到的特定 Python 共享库相对应或相关的安装或虚拟环境。例如,您不能强制为 Python 2.6 编译和链接的 mod_wsgi 使用 Python 2.7 安装。
    • @GrahamDumpleton 并不是我在怀疑,但我实际上正在测试它,我从来没有想过这一点,因为我从来没有遇到过这个问题。 :)
    猜你喜欢
    • 2018-04-01
    • 2017-08-18
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2013-08-27
    • 2018-11-11
    • 2020-04-28
    相关资源
    最近更新 更多