#質問の内容
Flaskでメールの送信を行うプログラムを書いています。
同期処理の場合と非同期処理の場合とで2種類書いているのですが、
非同期処理の場合のみ、with app.app_context()ブロック内で送信処理を行わなければ下記のようなエラーが出てしまいます。
Python
1This typically means that you attempted to use functionality that needed 2to interface with the current application object in some way. To solve 3this, set up an application context with app.app_context().
なぜ非同期処理の場合のみ、with app.app_context()を利用してapplication contextをスタックへpush?する必要があるのか、がわかっていません。
なおapplication contextに関してはFlaskのドキュメントを一読した状態で、
「リクエストなど特定の処理におけるFlaskアプリの各データにアプリのインスタンスを直接扱うことなくアクセスできる仕組み、と認識しています。
#ソースコード
同期処理の場合
Python
1#!/usr/bin/python3 2 3#===モジュールのインポート 4import os 5from flask import Flask, render_template, session, redirect, url_for 6from flask_mail import Mail, Message 7from threading import Thread 8 9#===Flask用にアプリのインスタンス作成と秘密鍵の設定 10app = Flask(__name__) 11app.config['SECRET_KEY'] = 'hard to guess string' 12 13#===flask_mailの設定 14app.config['MAIL_SERVER'] = 'smtp.googlemail.com' 15app.config['MAIL_PORT'] = 587 16app.config['MAIL_USE_TLS'] = True 17app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME') 18app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') 19app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]' 20app.config['FLASKY_MAIL_SENDER'] = 'your_email@gmail.com' 21app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN') 22 23mail = Mail(app) 24 25def send_email(to, subject, template, **kwargs): 26 msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX']+subject, sender = app.config['FLASKY_MAIL_SENDER'], recipients = [to]) 27 msg.html = render_template(template + '.html', **kwargs) 28 mail.send(msg) 29
非同期処理の場合
Python
1#===flask_mailの設定 2app.config['MAIL_SERVER'] = 'smtp.googlemail.com' 3app.config['MAIL_PORT'] = 587 4app.config['MAIL_USE_TLS'] = True 5app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME') 6app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD') 7app.config['FLASKY_MAIL_SUBJECT_PREFIX'] = '[Flasky]' 8app.config['FLASKY_MAIL_SENDER'] = 'your_email@gmail.com' 9app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN') 10 11mail = Mail(app) 12 13def send_email(to, subject, template, **kwargs): 14 msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX']+subject, sender = app.config['FLASKY_MAIL_SENDER'], recipients = [to]) 15 msg.html = render_template(template + '.html', **kwargs) 16 thr = Thread(target=send_async_email, args=[app, msg]) 17 thr.start() 18 return thr 19 20def send_async_email(app, msg): 21 with app.app_context(): 22 mail.send(msg) 23
どちらもsend_emailを特定のパス内で呼び出すことでメールを送信しています。
お力お貸しいただけますと幸いです!
回答3件
あなたの回答
tips
プレビュー