Flask context和python-rq

时间:2013-09-26 14:42:00

标签: flask task-queue

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

0 个答案:

没有答案