遅延ライブラリを使用したバックグラウンド作業の補足(GAE/python)
http://code.google.com/intl/ja/appengine/articles/deferred.html
の補足。
上記に書かれているまま行っても、
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/deferred/deferred.py", line 129, in run
raise PermanentTaskFailure(e)
PermanentTaskFailure: 'module' object has no attribute 'MyDefrredTestHandler'
というエラーが出てしまう。
調べると、
http://stackoverflow.com/questions/6225400/problem-posting-to-datastore-with-deferred-defer-tasks
にも書かれている通り、呼び出される関数を別ファイルに移し、
それを読み込んで実行する必要がある模様。
自分のコードの場合・・
def backgroundSendMail(self , sender , to , subject , body):
mail.send_mail(sender = sender,
to = to,
subject = subject,
body = body)
という形で、呼び出し側と同じクラスに入れてしまっていた実行部分を、
defrred.pyというファイルを作り、そちらに移すことに。
作ったpyファイルに、そのまま頭から、
from google.appengine.api import mail
def backgroundSendMail(sender, to , subject , body):
mail.send_mail(sender = sender,
to = to,
subject = subject,
body = body)
という、selfを抜いた形で書き込んだ。
そして元々のpyファイルへは、
from defrred import backgroundSendMail
を頭に書き、作成したpyファイルの関数を読み込むように。
あとは、
deferred.defer(backgroundSendMail,
"from"
"xx@xx.com",
"title",
"body")
という形で呼び出すようにしたら、正常に動作した。