如何解决在尝试使用WSGI在Apache2上部署Flask时出现的导入错误

35

我在使用wsgi将flask应用程序部署到apache2时遇到了问题。我已经在下面发布了错误日志和配置文件。我尝试过移动文件、重命名等等,但都给我返回了内部服务器错误。不确定为什么会出现导入错误。欢迎任何意见/建议,谢谢!

这是我的Apache错误日志:

[Sun Sep 12 20:47:59 2010] [error] [client] mod_wsgi (pid=9753): Target WSGI script '/sites/flaskfirst/wsgi.py' cannot be loaded as Python module.
[Sun Sep 12 20:47:59 2010] [error] [client] mod_wsgi (pid=9753): Exception occurred processing WSGI script '/sites/flaskfirst/wsgi.py'.
[Sun Sep 12 20:47:59 2010] [error] [client] Traceback (most recent call last):
[Sun Sep 12 20:47:59 2010] [error] [client]   File "/sites/flaskfirst/wsgi.py", line 1, in <module>
[Sun Sep 12 20:47:59 2010] [error] [client]     from app import app as application
[Sun Sep 12 20:47:59 2010] [error] [client] ImportError: No module named app

wsgi.py

# This is wsgi.py
from app import app as application

app.py

# This is app.py
from flask import Flask, render_template
import settings

app = Flask(__name__)
app.debug = settings.DEBUG

from views.homepage import *
from views.events import *
from views.submit import *
from views.feed import *

if __name__ == "__main__":
    app.run()

以下是目录树的基础知识,以便让您有所了解。

/flaskfirst/
    /static/
    /templates/
    /views/
    __init__.py
    app.py
    wsgi.py

这是 Apache 虚拟主机文件

<VirtualHost *:80>
        ServerAdmin sreustle@gmail.com
        ServerName crath.org
        DocumentRoot /sites/flaskfirst

        # WSGI Settings
        WSGIScriptAlias / /sites/flaskfirst/wsgi.py
        WSGIDaemonProcess flaskfirst user=sreustle group=general processes=1 threads=10
        WSGIProcessGroup flaskfirst

        # Static Directories
        Alias /static /sites/flaskfirst/static/
        <Location "/static">
                SetHandler None
        </Location>

</VirtualHost>
2个回答

32

感谢在 irc.freenode.org 的 #pocoo 频道上的 zarfdamjan,他们帮助我解决了这个问题。问题是 PythonPath 不正确。我们通过使用以下 wsgi.py 来解决了这个问题。

import sys
sys.path.insert(0, "/sites/flaskfirst")

from app import app
application = app

4
我也遇到了相同的问题。我在我的httpd配置文件中添加了WSGIDaemonProcess appName python-path=/home/...。不确定是否是正确的位置,但是这是一个可选项。关于WSGIDaemonProcess的更多信息请参考:链接 - chris
谢谢!你救了我的一天!! - Roomm

4

我使用了你的解决方案来使它工作,但是它一直在sys.path中重复路径(您可以将其写出来查看是否发生),所以我做了一点修改:

import sys
flaskfirst = "/sites/flaskfirst"
if not flaskfirst in sys.path:
    sys.path.insert(0, flaskfirst)

from app import app
application = app

这样只会被包含一次


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接