我有一个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在运行我的应用程序的同一虚拟环境中运行,并且worker检测到该任务。但是,我得到了以下回溯,无法弄清楚如何解决这个问题:
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():
的尝试失败了;工人甚至无法导入我想要使用的功能。我在这里做错了什么?