定期的に処理を走らせる
それでは、メールによる締切通知部分を作成しようと思います。
まず、締切時にメールを送信する設定になっていて、かつ、締切を過ぎているのにまだメールを送信していないTODOタスクを抜き出します。
now = datetime.datetime.today() now += datetime.timedelta(hours=9) queryset = Task.gql( "WHERE limit_time != :none " + "AND limit_time <= :now " + "AND is_notified = True " + "AND mail_send_time = :none " + "LIMIT 10 ", now=now, none=None)
ここで、Nullの判定をするのにわざわざ :none とバインド変数を定義して none=None とNoneバインドしているのは、GQLの仕様でIS NULLといった構文が用意されていないからです。また、LIMIT 10と限定しているのは、大量のTODOが引っかかって処理がタイムアウトすることを防ぐためです。ちなみに、現在日時に9時間を足しているのは、日本時間に合わせるためです。もちろん、ちゃんと作るにはタイムゾーンを指定するべきですが、今回は日本専用で自分用という位置づけなので目をつぶります。
次に、メール送信部分のメソッドを用意します。
def send_notifier_mail(task, now): message = mail.EmailMessage(sender="...") # 管理者のメールアドレス message.to = task.user.email message.subject = u"金星翻車魚:締切のお知らせ" message.body = u''' こんにちは、%sさん ご登録いただいた以下のTODOが 指定された締切日時に到達したことをお知らせします。 タイトル: %s 締切 : %s ''' % (task.user.username, task.title, task.limit_time.strftime("%Y-%m-%d %H:%M"),) message.send() logging.info(message.body) task.mail_send_time = now task.save() return
これら二つの処理を組み合わせたメソッドをcronjobという名前でviews.pyに定義し、それを、/todo/cronというURLに紐づけることにします。
/todo/urls.py
urlpatterns = patterns('todo.views', (r'^$', 'list_tasks'), (r'^create$', 'add_task'), (r'^delete$', 'delete_task'), (r'^update$', 'update_task'), (r'^cron$', 'cronjob'), )
これで/todo/cronというURLにアクセスすると締切お知らせメールが送信されるようになりました。このURLはGoogle App Engineのcron処理で利用し、一般のアクセスは受け取らないつもりですので、app.yamlに以下の行を付け足します。
/app.yaml
- url: /todo/cron script: common/appenginepatch/main.py login: admin
login: adminと指定することで、一般のアクセスを受け取らないようにしています。なお、この設定は、以下の一般アクセス用の設定の前に入れておきます。
/app.yaml
- url: /.* script: common/appenginepatch/main.py
最後に、Google App Engineのcron(定期実行処理)の設定を書けば完了です。app.yamlと同じトップフォルダにcron.yamlというファイルを作成し、以下の設定を書き入れます。
/cron.yaml
cron: - description: todo cron job url: /todo/cron schedule: every 15 minutes
これで、15分おきに定期実行されるようになりました。いつものようにmanage.py updateコマンドを発行し、金星翻車魚のサイトを更新しました。さて、次から何をしようかな。