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

Posted

技术标签:

【中文标题】尝试在 Apache2 上使用 WSGI 部署 Flask 时如何解决导入错误【英文标题】:How to solve import errors while trying to deploy Flask using WSGI on Apache2 【发布时间】:2011-04-11 10:18:18 【问题描述】:

我在使用 wsgi 在 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>

【问题讨论】:

【参考方案1】:

感谢 irc.freenode.org 上 #pocoo 的 zarfdamjan,他们能够帮助我解决这个问题。问题是 PythonPath 不正确。我们使用以下 wsgi.py 修复了这个问题

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

from app import app
application = app

【讨论】:

遇到了同样的问题。我将它添加到我的 httpd 配置文件中的WSGIDaemonProcess appName python-path=/home/...。不确定这是否是正确的地方,但 FWIW 是一种选择。有关 WSGIDaemonProcess 的更多信息:[链接] (code.google.com/p/modwsgi/wiki/…) 谢谢!你拯救了我的一天!【参考方案2】:

我使用你的解决方案让它工作,但它一直在复制 sys.path 中的路径(你可以把它写出来看看它是否发生在你身上)所以我做了一些修改:

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

from app import app
application = app

这样它只包含一次

【讨论】:

以上是关于尝试在 Apache2 上使用 WSGI 部署 Flask 时如何解决导入错误的主要内容,如果未能解决你的问题,请参考以下文章

如何部署Apache2+mod_wsgi+flask?

在 Apache 2.4 上部署 Django

mod_wsgi 错误:ModuleNotFoundError:没有名为“django”的模块

使用 mod_wsgi 部署 django3 项目

使用 apache2 在 mod_wsgi 上运行 django python 3.4

'使用mod_wsgi在apache上部署django app时,没有名为'encodings''的模块