使用Flask-Security发送异步电子邮件

时间:2014-12-07 17:10:19

标签: asynchronous flask flask-security flask-mail

我正在尝试将Flask-Security配置为异步发送电子邮件。

我有一些代码通过Flask-Mail发送异步电子邮件,但我无法将其与我的应用程序工厂函数集成,因此它可以与Flask-Security一起使用。

申请工厂:

mail = Mail()
db = SQLAlchemy()
security = Security()

from app.models import User, Role
user_datastore = SQLAlchemyUserDatastore(db, User, Role)

def create_app(config_name):
    # Config
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    # Initialize extensions
    mail.init_app(app)
    db.init_app(app)
    security.init_app(app, user_datastore)

    return app

在Flask-Security文档中,它说使用@security.send_mail_task覆盖扩展程序发送电子邮件的方式。

那么我究竟在哪里实现这个装饰器呢?好像我把它放在应用工厂里面的任何地方,我得到循环导入。

这些是我尝试使用的异步电子邮件功能,取自this issue

@async
def send_security_email(msg):
    with app.app_context():
       mail.send(msg)

@security.send_mail_task
def async_security_email(msg):
    send_security_email(msg)

为了使用应用工厂,需要放置此代码?

提前致谢。

1 个答案:

答案 0 :(得分:0)

我能够这样做:

mail = Mail()
db = SQLAlchemy()
security = Security()

from app.models import User, Role
user_datastore = SQLAlchemyUserDatastore(db, User, Role)

def create_app(config_name):
    # Config
    app = Flask(__name__)
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)

    # Initialize extensions
    mail.init_app(app)
    db.init_app(app)
    security_ctx = security.init_app(app, user_datastore)

    # Send Flask-Security emails asynchronously
    @security_ctx.send_mail_task
    def async_security_email(msg):
        send_security_email(app, mail, msg)

    return app