【问题标题】:Apache + WSGI to run Flask, get Python ImportError: "cannot import name ..." or "No module named ..."Apache + WSGI 运行 Flask,得到 Python ImportError: "cannot import name ..." or "No module named ..."
【发布时间】:2015-11-11 06:52:44
【问题描述】:

尊敬的 SO 用户您好,欢迎来到我的第一个 SO 问题,

我目前正在寻找使用 Apache 和 mod_wsgi 部署 Flask 应用程序。一切都是用 Python 3.4 编码的,所以我必须遵循几个 tutorials / questions 才能让 mod_wsgi 使用我的 Python 版本(因为 apt-get install 为您提供与 Python 2.7 兼容的 3.4 版本,您必须在 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,这可以在最小的应用程序中正常工作,我尝试过没有任何问题。

我的应用程序稍微复杂一些,并使用 ma​​nage.py 文件在 localhost 上运行,这可能是尝试在 Apache 上部署时出现问题的一部分。

根据我在无数 SO Questions 和其他网站的问题中发现的内容,这很可能来自:

  • 权限问题(如果执行当前脚本的用户没有读取他要导入的脚本的权限)
  • 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', &lt;among others&gt;] ,这表明顶级文件夹 issys.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 似乎找不到 LongAppName.ShorterAppName.app,我不知道为什么。

根据我为测试我最初编写的代码的不同替代方案所做的尝试次数,我开始忘记什么是好的以及什么可能导致问题,所以我需要你的帮助来解决这个问题出去。

提前致谢!

【问题讨论】:

    标签: apache python-3.x module flask wsgi


    【解决方案1】:

    您的某些目录权限现在是可疑的。你有:

        drwxr--r-- ShorterAppName
    

    更好用:

        drwxr-xr-x ShorterAppName
    

    静态和模板相同。

    我们真正需要看到的是准确的 Python 异常详细信息以及来自 Apache 错误日志的回溯。

    【讨论】:

    • 感谢您的回复,这些目录确实需要可执行,在我对 LongAppName 的所有子目录使用chmod a+x 后,错误消息发生了变化。我现在收到的错误消息是:[Wed Aug 19 08:23:38.650234 2015] [wsgi:error] [pid 1953:tid 139798123620096] [client 192.168.0.17:51452] TypeError: __call__() takes from 1 to 2 positional arguments but 3 were given 我不确定它是哪个 __call__(),但它很可能来自使用 manage.py 文件启动应用程序的方式。您想查看文件的内容还是我应该再问一个问题?
    • 有必要查看异常的完整回溯,以便可以看到发生的位置。
    • 这里是回溯:[mpm_event:notice] [pid 2998:tid 140561778562944] AH00489: Apache/2.4.10 (Debian) mod_wsgi/4.4.13 Python/3.4.2 configured -- resuming normal operations [core:notice] [pid 2998:tid 140561778562944] AH00094: Command line: '/usr/sbin/apache2' [wsgi:error] [pid 3001:tid 140561554056960] [client 192.168.0.17:52081] mod_wsgi (pid=3001): Exception occurred processing WSGI script '/var/www/LongAppName/longappname.wsgi'. [wsgi:error] [pid 3001:tid 140561554056960] [client 192.168.0.17:52081] TypeError: __call__() takes from 1 to 2 positional arguments but 3 were given
    • 无论“经理”是什么,它都不能用作 WSGI 应用程序。您通常会使用 Flask() 应用程序对象。
    • 我确实认为这可能是问题所在。 manager 在我的 app.py 中创建,如下所示:from flask import Flask app = Flask(__name__) app.debug = True from flask.ext.script import Manager manager = Manager(app)
    猜你喜欢
    • 2016-12-23
    • 2016-12-19
    • 1970-01-01
    • 2017-02-20
    • 2015-02-27
    • 1970-01-01
    • 2021-07-20
    • 2017-03-31
    • 2017-12-08
    相关资源
    最近更新 更多