Apache + WSGI运行Flask,得到Python ImportError:“无法导入名称…”或“No module named …”

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

我目前正在使用Apachemod_wsgi来部署一个Flask应用程序。 所有东西都用Python 3.4编码,所以我不得不遵循几个教程 / 问题来获得mod_wsgi与我的Python版本(因为apt-get install获得了与Python 2.7兼容的3.4版本,你必须在获得它之后编译它在一个Python 3 virtualenv点是它的4.x版本)。

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

我的问题在于在.wsgi文件中input应用程序。 像这样的教程通常from FlaskApp import app as application考虑他们的文件树,并且这工作按预期用最less的应用程序,我尝试没有任何问题。

我的应用程序稍微复杂一些,使用manage.py文件在本地主机上运行,​​一旦尝试在Apache上部署,这可能是问题的一部分。

从我发现的无数SO问题和其他网站的问题中,最有可能来自:

  • 权限问题(如果执行当前脚本的用户没有正在读取的脚本的读取权限)
  • sys.path问题(如果顶级文件夹不在sys.path ,Python 3看不到)

主要是出于无奈,我最终在/ 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>] ,这表明顶级文件夹在sys.path

我的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似乎无法findLongAppName.ShorterAppName.app,我不知道为什么。

从我为了testing不同的替代scheme而做的尝试次数来看,我已经开始忽略什么是好的,什么可能会导致问题,所以我需要你的帮助来解决这个问题。

提前致谢!

现在有些目录权限可疑。 你有:

  drwxr--r-- ShorterAppName 

更好地使用:

  drwxr-xr-x ShorterAppName 

静态和模板相同。

我们真正需要看到的是具有从Apache错误日志回溯的确切Python异常详细信息。