Flask中的“ ImportError:无法导入名称邮件”

发布于 2021-01-29 17:12:36

我构建了一个简单的Web应用程序,其中包含Flask和Python,我打算将其上传到Heroku。

在本地启动我的应用程序时,请使用以下脚本:

#!venv/bin/python
from app import app
app.run(debug = True)

我收到此错误消息:

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

因此,它无法导入mail

app目录中我有this __init__.py,这是我创建的Mail对象,导致导入困难:

from flask import Flask
app = Flask(__name__)
from app import index
from flask.ext.mail import Mail
mail = Mail(app)

这是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

因此,根据错误消息,错误位于此文件的中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
关注者
0
被浏览
50
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您具有循环依赖关系。您必须了解Python在导入文件时在做什么。

    每当Python导入文件时,Python都会查看该文件是否之前已经开始导入。因此,如果模块A导入模块B,而模块B导入模块A,则Python将执行以下操作:

    • 开始运行模块A。
    • 当模块A尝试导入模块B时,请暂时停止运行模块A,然后开始运行模块B。
    • 然后,当模块B尝试导入模块A时,Python将不会继续运行模块A来完成;相反,模块B将只能从模块A导入在模块B开始运行之前已经在其中定义的属性。

    这是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)
    

    导入此文件时,只有Python运行脚本。创建的所有全局属性都将成为模块属性的一部分。因此,当您点击第三行时,已经定义了“ Flask”和“
    app”属性。但是,当你到了第三行,Python中开始尝试导入indexapp。因此,它开始运行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
    

    请记住,当这条巨蟒文件正在导入,您迄今为止只定义了Flaskappapp模块。因此,尝试导入mail将不起作用。

    因此,您需要重新排列代码,以便如果app.index依赖于中的属性app,则app在尝试导入之前定义该属性app.index



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看