【问题标题】:Flask and wsgi, ImportError: cannot import name appFlask 和 wsgi,ImportError: cannot import name app
【发布时间】:2015-02-27 14:32:52
【问题描述】:

您好,很抱歉再次打扰,我正在做我的第一个烧瓶项目,非常简单。

我将我的网站部署在 Digital Ocean 的 ubuntu 服务器上。我遵守了它的instructions

问题: 当我尝试在浏览器中打开该站点时,出现 500 错误。然后我查了一下apache的错误日志,发现如下几句。

错误日志:

[Wed Dec 31 07:45:49 2014] [error] [client 112.64.71.131] mod_wsgi (pid=27835): Target WSGI script '/var/www/qianshan/qianshan.wsgi' 无法加载为 Python模块。

[2014 年 12 月 31 日星期三 07:45:49] [错误] [客户端 112.64.71.131] mod_wsgi (pid=27835):处理 WSGI 脚本“/var/www/qianshan/qianshan.wsgi”时发生异常。

[Wed Dec 31 07:45:49 2014] [error] [client 112.64.71.131] Traceback(最近一次通话最后):

[2014 年 12 月 31 日星期三 07:45:49] [错误] [客户端 112.64.71.131] 文件“/var/www/qianshan/qianshan.wsgi”,第 7 行,在

[Wed Dec 31 07:45:49 2014] [error] [client 112.64.71.131] from qianshan import app as application

[Wed Dec 31 07:45:49 2014] [error] [client 112.64.71.131] ImportError: cannot import name app

项目的树形结构

spark@Qianshan:/var/www/qianshan$ tree -L 2
.
├── qianshan
│   ├── config.ini
│   ├── qianshan.py
│   ├── static
│   ├── templates
│   └── venv
└── qianshan.wsgi

虚拟主机配置

<VirtualHost *:80>
            ServerName qianshan.co
            ServerAdmin spark@qianshan.co
            WSGIScriptAlias / /var/www/qianshan/qianshan.wsgi
            <Directory /var/www/qianshan/qianshan/>
                    Order allow,deny
                    Allow from all
            </Directory>
            Alias /static /var/www/qianshan/qianshan/static
            <Directory /var/www/qianshan/qianshan/static/>
                    Order allow,deny
                    Allow from all
            </Directory>
            ErrorLog ${APACHE_LOG_DIR}/error.log
            LogLevel warn
            CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

wsgi

#!/usr/bin/python
import sys
import logging
logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/qianshan/")

from qianshan import app as application
application.secret_key = 'Add your secret key'

.py 文件

# Filename: qianshan.py
# encoding: utf-8

import ConfigParser
import codecs
from flask import Flask
from flask import render_template

app = Flask(__name__)

@app.route('/')
def index():
    block_list = getBlockList()
    website_dict = getWebsiteDict()
    return render_template('index.html', block_list=block_list, website_dict=website_dict)
...
...
if __name__ == '__main__':
    app.run()

如果你有幸看到这个底线,祝大家新年快乐^_^

【问题讨论】:

  • 您的 init.py 文件在哪里。我看不到 /var/www/qianshan/__init__.py 文件。
  • 我曾经偶然发现同样的问题,后来得知您无法从主文件中导出任何内容。您可能想查看此链接*.com/questions/419163/what-does-if-name-main-do
  • 是否启用了 SELinux?

标签: python apache flask wsgi


【解决方案1】:

创建一个/var/www/qianshan/init.py文件,如下所示:

from flask import Flask
app = Flask(__name__)
import quianshan.quianshan #This is your view file. 

然后从 quaanshan.py 中删除这一行

app = Flask(__name__)

【讨论】:

  • 非常感谢!您的意思是应该有一个名为 init.py 的文件吗?如果是这样,如果我将当前.py文件的名称从qianshan.py更改为init.py,这会解决问题吗?
  • 我把.py文件名改成了init.py,重新加载虚拟主机配置,重启apache服务,还是不行。错误相同