【问题标题】:Import Error: No module named Flask导入错误:没有名为 Flask 的模块
【发布时间】:2015-01-26 03:40:54
【问题描述】:

使用 Flask、apache2 和 Python 3.4.2 运行我的服务器时出现 500 内部服务器错误。

一开始我没有创建虚拟环境就安装了 Flask,所以我认为这可能是一个原因。但是,我后来使用以下方法为我的应用创建了虚拟环境:

python3.4 -m venv venv
source venv/bin/activate
(venv) pip3 install Flask

我通过使用 python3 __init.py 运行我的应用程序进行了检查,它在本地运行。 然后我重新加载了我的 apache2 服务器,仍然得到同样的错误。请参阅以下错误日志文件的输出:

mod_wsgi (pid=25667): Target WSGI script '/var/www/FlaskApp/flaskapp.wsgi' cannot be loaded as Python module.
mod_wsgi (pid=25667): Exception occurred processing WSGI script '/var/www/FlaskApp/flaskapp.wsgi'.
Traceback (most recent call last):
File "/var/www/FlaskApp/flaskapp.wsgi", line 11, in <module>
from XYZ import app as application
File "/var/www/FlaskApp/XYZ/__init__.py", line 1, in <module>
from flask import Flask, render_template
ImportError: No module named flask

有什么建议可以解决吗?

etc/apache2/sites-available 中的 FlaskApp.conf 文件

<VirtualHost *:80>

ServerName xyz.com

ServerAlias www.xyz.com

ServerAdmin contact@xyz.com
WSGIScriptAlias / /var/www/FlaskApp/flaskapp.wsgi
<Directory /var/www/FlaskApp/XYZ/>
Order allow,deny
Allow from all
</Directory>
Alias /static /var/www/FlaskApp/XYZ/static
<Directory /var/www/FlaskApp/XYZ/static/>
Order allow,deny
Allow from all
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

这是 apache2 错误日志文件中的一行:

AH00489: Apache/2.4.10 (Ubuntu) mod_wsgi/3.5 Python/2.7.8 configured -- resuming normal operations

看起来 mod_wsgi 正在尝试使用 2.7.8 而不是 3.4。我该如何解决?

【问题讨论】:

  • 我检查了我的 flaskapp 文件夹 - 有一个名为 venv 的文件夹,其中包含 lib 文件夹,其中包含 flask。为什么它不起作用?
  • 我注意到有趣的事情 - 当我检查虚拟环境文件夹时,站点包下没有 Flask,即使它显示好像它在我执行 pip3 install Flask 时已安装。我会尝试使用 pip。
  • 我尝试使用 pip - 这次 venv 中有烧瓶,但仍然收到相同的错误 - 500 并且 apache2 日志文件中没有烧瓶模块。
  • 删除使用 Python 3.x.x 制作的虚拟环境并使用 Pyhton 2.x.x 制作一个

标签: python-3.x flask apache2 wsgi


【解决方案1】:

我想我终于解决了! 我将以下代码行添加到位于 etc/apache2/sites-available 的 FlaskApp.conf 文件中:

WSGIPythonPath /var/www/FlaskApp/XYZ/venv/:/var/www/FlaskApp/XYZ/venv/lib/python3.4/site-packages

这一行应该在 VirtualHost 之前!

然后我重新启动 apache 并让我的网站正常工作,除了只有 www,非 www 不起作用。

【讨论】:

    【解决方案2】:

    我将我的 xx.wsgi 从使用 execfile() 更改为使用 exec()。这是它最终工作时的样子。

    activate_this = '/opt/flask/project_name/py3venv/bin/activate_this.py'
    exec(open(activate_this).read(), dict(__file__=activate_this))
    
    import sys
    sys.path.insert(0, '/opt/flask/project_name')
    
    from project_app_name import app as application
    

    【讨论】:

    • 你能解释一下你在activate_this.py中放了什么
    • 它是由 virtualenv 在我执行这些命令时生成的:“cd /opt/flask/bionxws”和“virtualenv -p /usr/bin/python3 p3venv”
    【解决方案3】:

    mod_wsgi 可能不知道您的 virtualenv,只需要被告知使用它而不是默认系统环境。

    Django 文档中的This info 应该会有所帮助。

    如果没有,请发布您的 flaskapp.wsgihttpd.conf 文件。

    【讨论】:

    • flaskapp.wsgi 如下所示:
    • #! /usr/bin/python3.4 import sys import logging logging.basicConfig(stream=sys.stderr) sys.path.insert(0,"var/www/FlaskApp") from XYZ import app as application application.secret_key = "secret " code
    • 没有 httpd.conf 文件 - 我检查了 apache2 文件夹。如果有帮助,我发布了 FlaskApp.conf 文件。感谢您的调查!
    • 它不在 apache2 文件夹中。我将创建它并添加以下行:
    • WSGIPythonHome /path/to/my/virt/env
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2018-07-10
    • 2015-11-30
    • 2012-05-25
    • 2012-03-16
    • 2011-12-10
    • 2016-07-18
    相关资源
    最近更新 更多