読者です 読者をやめる 読者になる 読者になる

DjangoのurlresolversでURL以外を振り分ける

リクエストを即時実行したくない

現在作ってるゲームでは諸々の都合で複数のリクエストを一度キューに貯めて後からまとめて実行する仕組みが必要になっている。
そういう時にどうするかってのを、@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 って名前は内部で決め打たれてるので変えちゃダメ。