2012-06-15 2 views
2

Flask-Mail 확장 기능을 갖춘 Flask 응용 프로그램에서 전자 메일을 보내고 있습니다. 그것은 동 기적으로 send() 메서드를 실행하고 메시지를 보낼 때까지 기다려야합니다. 백그라운드에서 실행하려면 어떻게해야합니까?Flask-Mail을 비동기 적으로 실행하십시오.

+4

의 사용 가능한 복제 [이] (http://stackoverflow.com/questions/10003933/whats-the-proper-way-to-run-some-python-code-asynchronously) – Enrico

답변

7

다른 스레드에서 메일을 보내야하므로 기본 스레드를 차단하지 않습니다. 하지만 한 가지 트릭이 있습니다.

import threading 
from flask import render_template, copy_current_request_context, current_app 
from flask_mail import Mail, Message 

mail = Mail() 

def create_massege(to_email, subject, template, from_email=None, **kwargs): 
    if not from_email: 
     from_email = current_app.config['ROBOT_EMAIL'] 
    if not to_email: 
     raise ValueError('Target email not defined.') 
    body = render_template(template, site_name=current_app.config['SITE_NAME'], **kwargs) 
    subject = subject.encode('utf-8') 
    body = body.encode('utf-8') 
    return Message(subject, [to_email], body, sender=from_email) 

def send(to_email, subject, template, from_email=None, **kwargs): 
    message = create_massege(to_email, subject, template, from_email, **kwargs) 
    mail.send(message) 

def send_async(to_email, subject, template, from_email=None, **kwargs): 
    message = create_massege(to_email, subject, template, from_email, **kwargs) 

    @copy_current_request_context 
    def send_message(message): 
     mail.send(message) 

    sender = threading.Thread(name='mail_sender', target=send_message, args=(message,)) 
    sender.start() 

@copy_current_request_context 장식에주의를 기울

mail_sender.py :

다음은 메일 본문을 작성, 템플릿을 렌더링하고, 동기 및 비동기 모두를 보낼 수 있습니다 내 코드입니다. Flask-Mail 내부는 요청 문맥을 사용하기 때문에 필요합니다. 새 스레드에서 실행하면 컨텍스트가 누락됩니다. @copy_current_request_context으로 꾸미기 기능을 막을 수 있습니다. Flask가 함수를 호출 할 때 문맥을 푸시합니다. 내가 Marboni의 코드가 이렇게 여기에서 살펴 단순화하고 싶은

run.py

app = Flask('app') 
mail_sender.mail.init_app(app) 
+0

정말 유용합니다! 감사! –

0

:

는 또한 플라스크 응용 프로그램과 mail 객체를 초기화해야이 코드를 사용합니다.

import threading 

from flask import copy_current_request_context 
from flask_mail import Message 
from app import app, mail 


def create_message(recipient, subject, body): 

    if not recipient: 
     raise ValueError('Target email not defined.') 

    subject = subject.encode('utf-8') 
    body = body.encode('utf-8') 

    return Message(subject, [recipient], body, sender=app.config['MAIL_USERNAME'] or "[email protected]") 


def send_async(recipient, subject, body): 

    message = create_message(recipient, subject, body) 

    @copy_current_request_context 
    def send_message(message): 
     mail.send(message) 

    sender = threading.Thread(name='mail_sender', target=send_message, args=(message,)) 
    sender.start() 
관련 문제