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も定義されているのでこれを使うのがいいのかも