2014-12-07 57 views
1

我試圖配置Flask-Security以異步方式發送郵件。使用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 

在燒瓶中,安全文檔,它說用@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) 

哪裏需要該碼被整理與應用工廠上班?

在此先感謝。

回答

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