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 和其他站点的问题中发现的内容,这很可能来自:
- 权限问题(如果执行当前脚本的用户没有对他要导入的脚本的阅读权限)
- 一个
sys.path
问题(如果顶层文件夹不在sys.path
,Python3看不到)
主要是出于无奈,我最终在 /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 错误日志的回溯。
亲爱的 SO 用户,您好,欢迎来到我的第一个 SO 问题,
我目前正在寻找使用 Apache 和 mod_wsgi
部署 Flask 应用程序的方法。一切都是用 Python 3.4 编码的,所以我必须遵循几个 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 和其他站点的问题中发现的内容,这很可能来自:
- 权限问题(如果执行当前脚本的用户没有对他要导入的脚本的阅读权限)
- 一个
sys.path
问题(如果顶层文件夹不在sys.path
,Python3看不到)
主要是出于无奈,我最终在 /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 错误日志的回溯。