# Ответы

## Ответы

> В отличие от базовых объектов 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. См. также [коды статуса](/django-rest-framework-russian-documentation/overview/navigaciya-po-api/status-codes.md).
* `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.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://ilyachch.gitbook.io/django-rest-framework-russian-documentation/overview/navigaciya-po-api/responses.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
