我有一个带有如下结构的蓝图的 Flask 应用程序:
application.py
project/
form_emailer.py
blueprints/
example_form.py
wtforms-models/
example_form_model.py
templates/
example_form_template.html
我正在尝试使用 RQ 在后台发送电子邮件(使用Flask-Mail),因为我们的 SMTP 使用 Gmail 服务器,这可能需要几秒钟才能完成。我在 form_emailer.py 中的函数如下所示:
from flask import Flask
from flask.ext.mail import Mail, Message
from application import app, q
mail = Mail(app)
def _queue_message(message):
mail.send(message)
def sendemail(recipients, subject, body):
"""
This function gets called in a Flask blueprint.
"""
message = Message(recipients=recipients, subject=subject, body=body)
q.enqueue(_queue_message, message)
我的(简化的)application.py 看起来像这样。我打破了惯例,使用“import *”来简化那里的添加(我们在这些包中的 __init__.py 动态导入所有模块):
from flask import Flask
from redis import Redis
from rq import Queue
app = Flask(__name__)
q = Queue(connection=Redis())
from project.blueprints import *
from project.forms import *
if __name__ == "__main__":
app.run()
我有一个 rqworker 在运行我的应用程序的同一虚拟环境中运行,并且工作人员检测到该任务。但是,我得到以下回溯,无法弄清楚如何解决这个问题:
16:41:29 *** Listening on high, normal, low...
16:43:26 low: project.form_emailer._queue_message(<flask_mail.Message object at 0x299d690>) (bd913b3a-4e7f-4efb-b51c-8ae11d37ac00)
16:43:27 ImportError: cannot import name sendemail
Traceback (most recent call last):
...
File "./project/blueprints/example_form.py", line 4, in <module>
from project.form_emailer import sendemail
ImportError: cannot import name sendemail
我怀疑这与 Flask 的应用程序上下文有关,但我最初的使用尝试with app.app_context():
失败了;工人甚至无法导入我想使用的功能。我在这里做错了什么?