【Python・Django】Django REST frameworkで同一URLでrenderer_classesを動的に変更する方法
# django # python
環境
Django1.1 Django REST framework3.5
やりたかったこと
Django REST frameworkを使っている中で、GETリクエストの場合はjsonを返却し、postリクエストの場合はcsvを返却するという処理を実装したかった。
renderer_classesの変更方法
内部で使用されている、get_renderersをオーバーライドしてあげればokです。 本来の処理はrenderer_classesに記載されているclassをインスタンス化して返す処理となっています。 そのため、オーバーライドした処理の中でもきちんとインスタンス化したものを返却してあげる必要があります。
from djangorestframework_camel_case.render import CamelCaseJSONRenderer
from rest_framework_csv.renderers import CSVRenderer
from rest_framework.response import Response
class DataCollectionsDownloadsView(BaseView):
renderer_classes = ()
def get_renderers(self):
if self.request.method == 'POST':
return [CSVRenderer()]
elif self.request.method == 'GET':
return [CamelCaseJSONRenderer()]
def get(self, request, format=None):
foo = 'something'
return foo
def post(self, request, format=None):
rcontext = super().get_renderer_context()
context['header'] = (
self.request.GET['fields'].split(',')
if 'fields' in self.request.GET else None)
return context
公式にはここらへんの記載はありませんでしたが、Pythonのライブラリはこういうオーバーライドで拡張性持たせているものが多くて助かります。読みやすいし。