リクエストを即時実行したくない
現在作ってるゲームでは諸々の都合で複数のリクエストを一度キューに貯めて後からまとめて実行する仕組みが必要になっている。
そういう時にどうするかってのを、@cactusman と検討したのだけど MQ や Celery をそのままでは上手くいかなそうだったので、結局 Django モデルでキューっぽいテーブルを実装した。
class QueueTask(models.Model): """ キューに詰むタスク """ request = models.CharField(verbose_name=u'操作のリクエスト', max_length=256) created_at = models.DateTimeField(verbose_name=u'キューへの追加日時', auto_now_add=True) status = models.IntegerField(verbose_name=u'実行ステータス', default=0)
みたいな感じで。
で、この操作のリクエストによって実行内容が異なるのだが、その辺の振り分けを自分で書くのが面倒だったので urlresolvers を流用することにした。
urlresolvers の流用
前述の QueueTask のメソッドとしてタスクの実行部分はこんな感じになっている。
def exec_task(self): resolver = urlresolvers.RegexURLResolver(r'^/', 'queue_manager.task') callback, callback_args, callback_kwargs = resolver.resolve(self.request) result = callback(*callback_args, **callback_kwargs) self.save()
あとは、queue_manager/task.py を urls.py と同じように
urlpatterns = patterns( 'animal.task', url(r'^task/animal/put/(?P<animal_id>\d+)/$', 'put', name='put_animal'), )
みたいにして、view関数 みたいにタスクの実行部分を書けばOK。
注意点としては、urlpatterns って名前は内部で決め打たれてるので変えちゃダメ。