django-pistonで304を返す

django-pistonで返すレスポンスはpiston.utils.rcに定義されていて以下のような使い方をする。

    def read(self, request, *args, **kwargs):
        if not self.has_model():
            return rc.NOT_IMPLEMENTED

        pkfield = self.model._meta.pk.name

        if pkfield in kwargs:
            try:
                return self.queryset(request).get(pk=kwargs.get(pkfield))
            except ObjectDoesNotExist:
                return rc.NOT_FOUND
            except MultipleObjectsReturned: # should never happen, since we're using a PK
                return rc.BAD_REQUEST
        else:
            return self.queryset(request).filter(*args, **kwargs)

定義元を見てみるといくつかのHTTPステータスが用意されているのがわかる。

class rc_factory(object):
    """
    Status codes.
    """
    CODES = dict(ALL_OK = ('OK', 200),
                 CREATED = ('Created', 201),
                 ACCEPTED = ('Accepted', 202),
                 DELETED = ('', 204), # 204 says "Don't send a body!"
                 BAD_REQUEST = ('Bad Request', 400),
                 FORBIDDEN = ('Forbidden', 401),
                 NOT_FOUND = ('Not Found', 404),
                 NOT_ACCEPTABLE = ('Not acceptable', 406),
                 DUPLICATE_ENTRY = ('Conflict/Duplicate', 409),
                 NOT_HERE = ('Gone', 410),
                 INTERNAL_ERROR = ('Internal Error', 500),
                 NOT_IMPLEMENTED = ('Not Implemented', 501),
                 THROTTLED = ('Throttled', 503))

ただ304がない。

304を返したい場合どうするべきか、いろいろ試してみたところ、単純にdjangoのHttpResponseNotModifiedだけで大丈夫なようだった。
こんな感じ

        if request.META.get('HTTP_IF_MODIFIED_SINCE'):
            if not_modified(obj, request.META.get('HTTP_IF_MODIFIED_SINCE')): # if_modfied_sinceで304を返すかどうか判定する
                return HttpResponseNotModified()

なんで用意されてないのかわからないけど、django-piston-extended-utilsというのもあった。
https://github.com/gregbayer/django-piston-extended-utils

こちらには304も定義されているのでこれを使うのがいいのかも