Изменить структуру ответа 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
    )
Другие вопросы по тегам