# Ответы

## Ответы

> В отличие от базовых объектов HttpResponse, объекты TemplateResponse сохраняют детали контекста, который был предоставлен представлением для вычисления ответа. Окончательный результат ответа не вычисляется до тех пор, пока он не понадобится, позже в процессе ответа.
>
> * [Django documentation](https://docs.djangoproject.com/en/stable/ref/template-response/)

DRF поддерживает согласование содержимого HTTP, предоставляя класс `Response`, который позволяет возвращать содержимое, которое может быть преобразовано в несколько типов содержимого, в зависимости от запроса клиента.

Класс `Response` является подклассом Django `SimpleTemplateResponse`. Объекты `Response` инициализируются данными, которые должны состоять из собственных примитивов Python. Затем DRF использует стандартное согласование содержимого HTTP для определения того, как он должен отображать конечное содержимое ответа.

Нет необходимости использовать класс `Response`, при необходимости вы можете возвращать обычные объекты `HttpResponse` или `StreamingHttpResponse` из ваших представлений. Использование класса `Response` просто предоставляет более удобный интерфейс для возврата ответов Web API, согласованных по содержанию, которые могут быть преобразованы в различные форматы.

Если вы по каким-то причинам не хотите сильно кастомизировать DRF, вы всегда должны использовать класс `APIView` или функцию `@api_view` для представлений, которые возвращают объекты `Response`. Это гарантирует, что представление сможет выполнить согласование содержимого и выбрать подходящий рендерер для ответа, прежде чем он будет возвращен из представления.

***

## Создание ответов

### Response()

**Сигнатура:** `Response(data, status=None, template_name=None, headers=None, content_type=None)`.

В отличие от обычных объектов `HttpResponse`, вы не создаете объекты `Response` со сформированным содержимым. Вместо этого вы передаете несформированные данные, которые могут состоять из любых примитивов Python.

Рендереры, используемые классом `Response`, не могут нативно обрабатывать сложные типы данных, такие как экземпляры моделей Django, поэтому вам необходимо сериализовать данные в примитивные типы данных перед созданием объекта `Response`.

Вы можете использовать классы DRF `Serializer` для выполнения этой сериализации данных или использовать свою собственную сериализацию.

Аргументы:

* `data`: Сериализованные данные для ответа.
* `status`: Код статуса для ответа. По умолчанию 200. См. также [коды статуса](status-codes).
* `template_name`: Имя шаблона, который будет использоваться, если выбран `HTMLRenderer`.
* `headers`: Словарь заголовков HTTP для использования в ответе.
* `content_type`: Тип содержимого ответа. Как правило, он устанавливается автоматически рендерером в результате согласования содержимого, но в некоторых случаях может потребоваться явное указание типа содержимого.

***

## Атрибуты

### .data

Несформированные, сериализованные данные ответа.

### .status\_code

Цифровой код состояния ответа HTTP.

### .content

Сформированное содержимое ответа. Метод `.render()` должен быть вызван, прежде чем можно будет получить доступ к `.content`.

### .template\_name

Файл шаблона `template_name`, если он задан. Требуется, только если `HTMLRenderer` или другой пользовательский рендерер шаблона является применимым рендерером для ответа.

### .accepted\_renderer

Экземпляр рендерера, который будет использоваться для формирования ответа.

Устанавливается автоматически `APIView` или `@api_view` непосредственно перед возвратом ответа из представления.

### .accepted\_media\_type

Тип документа, который был выбран на этапе согласования контента.

Устанавливается автоматически `APIView` или `@api_view` непосредственно перед возвратом ответа из представления.

### .renderer\_context

Словарь дополнительной контекстной информации, которая будет передана в метод `.render()` рендерера.

Устанавливается автоматически `APIView` или `@api_view` непосредственно перед возвратом ответа из представления.

***

## Стандартные атрибуты HttpResponse

Класс `Response` расширяет `SimpleTemplateResponse`, и все обычные атрибуты и методы также доступны для ответа. Например, вы можете установить заголовки для ответа стандартным способом:

```python
response = Response()
response['Cache-Control'] = 'no-cache'
```

### .render()

**Сигнатура:** `.render()`.

Как и любой другой `TemplateResponse`, этот метод вызывается для преобразования сериализованных данных ответа в конечное содержимое ответа. Когда вызывается `.render()`, содержимое ответа будет установлено в результат вызова метода `.render(data, accepted_media_type, renderer_context)` на экземпляре `accepted_renderer`.

Обычно вам не нужно вызывать `.render()` самостоятельно, так как это обрабатывается стандартным циклом ответа Django.
