Flask-Mail 확장 기능을 갖춘 Flask 응용 프로그램에서 전자 메일을 보내고 있습니다. 그것은 동 기적으로 send() 메서드를 실행하고 메시지를 보낼 때까지 기다려야합니다. 백그라운드에서 실행하려면 어떻게해야합니까?Flask-Mail을 비동기 적으로 실행하십시오.
2
A
답변
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()
관련 문제
- 1. asp.net에서 메서드를 비동기 적으로 실행하십시오.
- 2. ASP.NET/WCF - Server.Execute을 비동기 적으로 실행하십시오.
- 3. 비동기 적으로 코드 뒤에서 .exe 파일을 실행하십시오.
- 4. ASP.NET에서 비동기 적으로 SSIS 또는 DTS 패키지를 실행하십시오.
- 5. ASP.net에서 비동기 적으로 WCF 호출 사용하지만 비동기 적으로 작동하지 않습니다.
- 6. iPhone에서 비동기 적으로 이미지로드
- 7. 비동기 적으로 이벤트 발생
- 8. 비동기 적으로 DataGrid에 데이터로드
- 9. 비동기 적으로 이미지를 루비에로드하십시오
- 10. 메서드를 비동기 적으로 호출
- 11. 읽기 파일을 비동기 적으로
- 12. 비동기 적으로 복사 됨
- 13. JavaScript로 비동기 적으로 이미지로드
- 14. 이미지를 비동기 적으로 반환
- 15. dll을 비동기 적으로 호출하기
- 16. vb.net 코드를 일괄 적으로 실행하십시오.
- 17. DLL에서 백그라운드 비동기 프로세스를 실행하십시오.
- 18. 비동기 모드에서 javascript 함수를 실행하십시오.
- 19. WebRequest.BeginGetResponse가 비동기 적으로 작동하지 않습니다.
- 20. 클릭 이벤트가 비동기 적으로 발생합니다
- 21. stdin을 비동기 적으로 읽는 방법?
- 22. 코코아 스트림에서 비동기 적으로 쓰기
- 23. PostSaveDocument 비동기 적으로 에이전트 호출
- 24. WPF MessageBox.Show를 비동기 적으로 호출하십시오.
- 25. 이벤트 처리기가 비동기 적으로 처리됩니까?
- 26. 비동기 적으로 인터넷에서 정보 수집
- 27. Tee a Pipe 비동기 적으로
- 28. Ember-data에 비동기 적으로 데이터로드
- 29. 업데이트 ASP.NET 패널은 비동기 적으로
- 30. 파일을 비동기 적으로 클라이언트에 다운로드하십시오.
의 사용 가능한 복제 [이] (http://stackoverflow.com/questions/10003933/whats-the-proper-way-to-run-some-python-code-asynchronously) – Enrico