【问题标题】:Odd Syntax Error when trying to deploy app with apache and mod_wsgi尝试使用 apache 和 mod_wsgi 部署应用程序时出现奇怪的语法错误
【发布时间】:2018-06-21 10:36:51
【问题描述】:

我正在学习如何通过构建最简单的“Hello, Word!”在 Ubuntu 16.04 服务器上使用 apache2.4 和 mod_wsgi 部署烧瓶应用程序。应用程序,但我遇到了与我的 wsgi 文件相关的奇怪语法错误,我被难住了。

Apache 似乎运行良好,但是当我点击应用程序的域时,我收到 apache 的标准 500 错误,并且日志列出以下内容:

[wsgi:error] [pid 28427:tid 140540431517440] mod_wsgi (pid=28427): Target WSGI script '/var/www/myapp.domain.com/myapp.wsgi' cannot be loaded as Python module.
[wsgi:error] [pid 28427:tid 140540431517440] mod_wsgi (pid=28427): Exception occurred processing WSGI script '/var/www/myapp.domain.com/myapp.wsgi'.
[wsgi:error] [pid 28427:tid 140540431517440] Traceback (most recent call last):
[wsgi:error] [pid 28427:tid 140540431517440]   File "/var/www/myapp.domain.com/myapp.wsgi", line 5, in <module>
[wsgi:error] [pid 28427:tid 140540431517440]     exec(file_.read(), dict(__file__=activate_this))
[wsgi:error] [pid 28427:tid 140540431517440]   File "<string>", line 4
[wsgi:error] [pid 28427:tid 140540431517440]     deactivate () {
[wsgi:error] [pid 28427:tid 140540431517440]                   ^
[wsgi:error] [pid 28427:tid 140540431517440] SyntaxError: invalid syntax

日志中引用的语法错误指向我的虚拟环境激活脚本中的代码,该脚本位于 ./venv/bin/activate

我想知道我使用 venv 模块与 virtualenv 是否会导致此问题

这是我的应用程序 wsgi 文件的内容(测试是烧瓶实例化的模块名称):

#!/usr/bin/python3
activate_this = '/var/www/myapp.domain.com/venv/bin/activate'
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

import sys
sys.path.insert(0, '/var/www/myapp.domain.com')

from test import app as application

【问题讨论】:

  • 你为什么要exec那个文件作为 Python 代码?这显然不是 Python 代码。
  • 您是否尝试从正在运行的 Python 脚本中激活 virtualenv? activate 脚本是 shell 脚本,不是 Python 代码,反正激活 virtualenv 已经来不及了。
  • 我也对此感到困惑。我知道这是shell脚本。我在烧瓶网站上关注documentation 来配置 .wsgi 文件。很底。我开始认为它只是为 virtualenv 而不是 venv 编写的
  • 那是activate_this.py,而不是activate(显然virtualenv 确实尝试支持在正在运行的解释器中激活,尽管它确实有一些警告让我认为他们不会支持它)。

标签: python flask mod-wsgi apache2.4


【解决方案1】:

无论大括号后面是什么(集合或 dict 显示或 dict 理解)deactivate () { 都不是合法的 Python 代码。当您尝试运行 SyntaxError 时,我看不出有什么奇怪或神秘的地方。

【讨论】:

    【解决方案2】:

    即使名称正确,也不建议使用activate_this.py 脚本。有关如何使用带有 mod_wsgi 的 Python 虚拟环境,请参阅以下文档:

    确保您也在使用 mod_wsgi 的守护程序模式。

    该文档中的细节太多,无法在此处复制,您使用什么方法取决于如何使用 mod_wsgi。

    【讨论】:

      【解决方案3】:

      我已经通过更改“python3 -m venv”构建的虚拟环境解决了这个问题。现在我通过virtualenv 创建venv,然后重新安装必要的模块。

      原因是python3创建的venv没有activate_this.py的脚本,这对编写myapp.wsgi文件很重要。

      professional document中,原因如下:

          When needing to activate the Python virtual environment from within the 
          WSGI script file as described, it is preferred that you be using the either 
          virtualenv or virtualenvwrapper to create the Python virtual environment. 
          This is because they both provide the activate_this.py script file which 
          does all the work of setting up sys.path. When you use either pyvenv or 
          python -m venv with Python 3, no such activation script is provided.
      

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-05-22
        • 2014-07-31
        • 2011-10-28
        • 2020-05-24
        • 1970-01-01
        • 2015-07-01
        相关资源
        最近更新 更多