Apache + WSGI to run Flask, get Python ImportError: "cannot import name ..." or "No module named ..."

Apache + WSGI to run Flask, get Python ImportError: "cannot import name ..." or "No module named ..."

亲爱的 SO 用户,您好,欢迎来到我的第一个 SO 问题,

我目前正在寻找使用 Apache 和 mod_wsgi 部署 Flask 应用程序的方法。一切都是用 Python 3.4 编码的,所以我必须遵循几个 / questions 才能让 mod_wsgi 与我的 Python 版本一起工作(因为 apt-get install 为您提供了 3.4 版本是 Python 2.7 兼容的,你必须在 Python 3 virtualenv 中用 pip 获取它后编译它才能成为 4.x 版本。

Apache 服务器 error.log 显示 Apache/2.4.10 (Debian) mod_wsgi/4.4.13 Python/3.4.2 configured 所以这似乎工作正常。

我的问题出在.wsgi 文件 中输入应用程序。教程 such as this one 通常会 from FlaskApp import app as application 考虑到他们的文件树,这在最小的应用程序中按预期工作,我试过了没有任何问题。

我的应用程序有点复杂,并且在本地主机上使用 manage.py 文件到 运行,这可能是问题的一部分在 Apache 上部署。

根据我在无数 SO Questions 和其他站点的问题中发现的内容,这很可能来自:

主要是出于无奈,我最终在 /var/www/ 中使用了 chmod 744 LongAppName,从而获得了 drwxrwxr-x 权限。 我的文件树如下:

drwxrwxr-x LongAppName
    drwxr-xr-x LongAppName
        drwxr--r-- ShorterAppName
            -rw-r--r-- app.py
            -rw-r--r-- commands.py
            -rw-r--r-- __init__.py
            drwxr--r-- static
            drwxr--r-- templates
            <irrelevant files>
        -rw-r--r-- __init__.py
        -rw-r--r-- manage.py
        drwxr-xr-x venv
        <more irrelevent files>
    -rwxr-xr-x longappname.wsgi

所以对于第一个可能的修复,权限对我来说似乎没问题。关于第二个,我在 .wsgi 文件中打印 sys.path,它输出 ['/var/www/LongAppName', <among others>],这表明 中的顶级文件夹 16=].

我的longappname.wsgi如下:

#!/var/www/LongAppName/LongAppName/venv/bin/python3
import os, sys, logging
#Doing some prints to check if we're in the venv and such.
PROJECT_DIR = '/var/www/LongAppName/'
if PROJECT_DIR not in sys.path:
    sys.path.insert(0, PROJECT_DIR)

def execfile(filename):
    globals = dict( __file__ = filename )
    exec( open(filename).read(), globals )

activate_this = os.path.join( PROJECT_DIR+'LongAppName/', 'venv/bin', 'activate_this.py' )
execfile( ativate_this )
#Printing sys.path and sys.executable here
logging.basicConfig(stream=sys.stderr)

from LongAppName.ShorterAppName.app import manager as application
#The previous line changed a lot, I tried importing app, changing the path but this one was the first one I wrote.

Python 好像找不到 LongAppName.ShorterAppName.app 也不知道为什么。

根据我为测试我最初编写的代码的不同替代方案所做的尝试次数,我开始忘记什么是好的以及什么可能导致问题,所以我需要你的帮助解决这个问题。

提前致谢!

您的某些目录权限现在值得怀疑。你有:

    drwxr--r-- ShorterAppName

最好使用:

    drwxr-xr-x ShorterAppName

静态和模板相同。

我们真正需要看到的是确切的 Python 异常详细信息以及来自 Apache 错误日志的回溯。