Изменить структуру ответа Djangorestframework
Я столкнулся с ситуацией, когда моему внешнему парню нужен ответ в следующем формате от всех моих конечных точек.
{
status: 200,
message: "OK",
content: {Normal DRF Response Body}
}
Я знаю, что могу получить эту структуру, используя APIView во всех моих представлениях, но тогда я не смогу использовать общие представления или наборы представлений.
Я думал, есть ли способ расширить класс ответа DRF и указать расширенный класс в settings.py или, возможно, использовать промежуточное программное обеспечение для этой цели.
Что для этого можно сделать?
1 ответ
Да, есть.
Вы можете реализовать свой рендерер и добавить его в файл settings.py следующим образом:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': (
'< your renderer >',
),
}
А для самого рендерера - черпайте вдохновение из рендера JSON от rest_framework ( rest_framework.renderers.JSONRenderer).
Вы можете взять реализацию этого JSONRenderer и немного изменить функцию рендеринга.
def render(self, data, accepted_media_type=None, renderer_context=None):
"""
Render `data` into JSON, returning a bytestring.
"""
Здесь вы будете иметь доступ к данным и renderer_context. Контекст имеет объект ответа, который является вашим ответом. Он имеет атрибут "status_code", который вы можете использовать в своем ответе.
response = renderer_context['response']
my_response = { "status" : response.status_code,
"message" : "OK",
"content" : data }
Для сообщения, это зависит от вас, где вы получите правильное сообщение для данного кода состояния.
Затем, если вы следуете исходной реализации JSONRendener, вы можете найти следующий фрагмент и просто изменить его, чтобы вывести новый ответ:
ret = json.dumps(
my_response, cls=self.encoder_class,
indent=indent, ensure_ascii=self.ensure_ascii,
allow_nan=not self.strict, separators=separators
)