遅延ライブラリを使用したバックグラウンド作業の補足(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")

という形で呼び出すようにしたら、正常に動作した。