我已经构建了一个简单的Web应用程序与Flask和Python,我打算上传到Heroku.
在本地启动我的应用程序时,使用以下脚本:
#!venv/bin/python
from app import app
app.run(debug = True)
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
Traceback (most recent call last):
File "./run.py", line 2, in <module>
from app import app, mail
File "/home/ricardo/personalSite/app/__init__.py", line 3, in <module>
from app import index
File "/home/ricardo/personalSite/app/index.py", line 6, in <module>
from emails import send_email
File "/home/ricardo/personalSite/app/emails.py", line 2, in <module>
from app import app, mail
ImportError: cannot import name mail
Run Code Online (Sandbox Code Playgroud)
所以,它无法导入mail.
在app我有这个目录的内部__init__.py,这里是我创建了Mail一个让我无法导入的对象:
from flask import Flask
app = Flask(__name__)
from app import index
from flask.ext.mail import Mail
mail = Mail(app)
Run Code Online (Sandbox Code Playgroud)
这是emails.py我调用send_mail函数的文件:
from flask.ext.mail import Message
from app import app, mail
from flask import render_template
from config import ADMINS
from decorators import async
Run Code Online (Sandbox Code Playgroud)
因此,根据错误消息,错误在此文件中,在from app import app, mail.
问题是什么?为什么不能导入mail?
更新:
这是我的目录列表:
persSite\
venv\
<virtual environment files>
app\
static\
templates\
__init__.py
index.py
emails.py
decorators.oy
tmp\
run.py
Run Code Online (Sandbox Code Playgroud)
Mar*_*eth 17
你有一个循环依赖.你必须意识到Python在导入文件时正在做什么.
每当Python导入文件时,Python就会查看该文件之前是否已经开始导入.因此,如果模块A导入导入模块A的模块B,那么Python将执行以下操作:
这是app/__init__.py,这是第一个要导入的文件.
from flask import Flask
app = Flask(__name__)
from app import index # <-- See note below.
from flask.ext.mail import Mail
mail = Mail(app)
Run Code Online (Sandbox Code Playgroud)
导入此文件时,只是运行脚本的Python.创建的任何全局属性都将成为模块属性的一部分.因此,当您点击第三行时,已定义属性'Flask'和'app'.但是,当你到了第三行,Python中开始尝试导入index从app.所以,它开始运行该app/index.py文件.
当然,这看起来如下:
from flask.ext.mail import Message
from app import app, mail # <-- Error here
from flask import render_template
from config import ADMINS
from decorators import async
Run Code Online (Sandbox Code Playgroud)
请记住,当这条巨蟒文件正在导入,您迄今为止只定义了Flask和app中app模块.因此,尝试导入mail将无法正常工作.
因此,您需要重新排列代码,以便在app.index依赖于属性时app,app在尝试导入之前定义该属性app.index.
| 归档时间: |
|
| 查看次数: |
12402 次 |
| 最近记录: |