3

我有一个带有如下结构的蓝图的 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():失败了;工人甚至无法导入我想使用的功能。我在这里做错了什么?

4

0 回答 0