Запросы-ответы
Начиная с этого момента мы действительно начнем освещать суть DRF. Давайте представим несколько основных строительных блоков.
Объекты запроса
DRF вводит объект Request
, который расширяет обычный HttpRequest
и обеспечивает более гибкий разбор запроса. Основной функциональностью объекта Request
является атрибут request.data
, который аналогичен request.POST
, но более полезен для работы с Web API.
Объекты ответа
DRF также вводит объект Response
, который является типом TemplateResponse
, который принимает неотрендерреное содержимое и использует согласование содержимого для определения правильного типа содержимого для возврата клиенту.
Коды состояния
Использование числовых кодов состояния HTTP в представлениях не всегда удобно для чтения, и легко не заметить, если вы ошиблись с кодом ошибки. DRF предоставляет более явные идентификаторы для каждого кода состояния, такие как HTTP_400_BAD_REQUEST
в модуле status
. Хорошая идея - использовать их повсеместно, а не использовать числовые идентификаторы.
Оборачивание представлений API
DRF предоставляет две обертки, которые можно использовать для написания представлений API.
Декоратор
@api_view
для работы с представлениями, основанными на функциях.Класс
APIView
для работы с представлениями на основе классов.
Эти обертки предоставляют несколько функциональных возможностей, таких как обеспечение получения экземпляров Request
в вашем представлении и добавление контекста к объектам Response
, чтобы можно было выполнить согласование содержимого.
Обертки также обеспечивают такое поведение, как возврат ответов 405 Method Not Allowed
, когда это необходимо, и обработку любых исключений ParseError
, возникающих при доступе к request.data
с неправильно сформированным вводом.
Собираем все вместе
Итак, давайте начнем использовать эти новые компоненты, чтобы немного отрефакторить наши представления.
Наше представление экземпляра улучшилось по сравнению с предыдущим примером. Оно немного лаконичнее, и код теперь очень похож на тот, который мы использовали при работе с Forms API. Мы также используем именованные коды состояния, что делает значения ответов более очевидными.
Вот представление для отдельного фрагмента в модуле views.py
.
Все это должно казаться очень знакомым - это не сильно отличается от работы с обычными представлениями Django.
Обратите внимание, что мы больше не привязываем наши запросы или ответы к определенному типу содержимого. request.data
может обрабатывать входящие запросы json
, но может обрабатывать и другие форматы. Точно так же мы возвращаем объекты ответа с данными, но позволяем DRF преобразовать ответ в нужный нам тип содержимого.
Добавление необязательных суффиксов формата к нашим URL-адресам
Чтобы воспользоваться тем, что наши ответы больше не привязаны к одному типу содержимого, давайте добавим поддержку суффиксов формата в наши конечные точки API. Использование суффиксов формата дает нам URL, которые явно ссылаются на определенный формат, и означает, что наш API сможет обрабатывать такие URL, как http://example.com/api/items/4.json.
Начните с добавления именованного аргумента format
к обоим представлениям, как показано ниже.
и
Теперь немного обновите файл snippets/urls.py
, чтобы добавить набор format_suffix_patterns
в дополнение к существующим URL.
Нам необязательно добавлять эти дополнительные шаблоны url, но это дает нам простой и чистый способ ссылаться на определенный формат.
Как это выглядит?
Перейдите к тестированию API из командной строки, как мы это делали в учебнике часть 1. Все работает примерно так же, хотя мы получили более удобную обработку ошибок при отправке некорректных запросов.
Мы можем получить список всех сниппетов, как и раньше.
Мы можем контролировать формат ответа, который мы получаем, либо используя заголовок Accept
:
Либо путем добавления суффикса формата:
Аналогично, мы можем контролировать формат отправляемого запроса, используя заголовок Content-Type
.
Если вы добавите переключатель --debug
к вышеуказанным запросам http
, вы сможете увидеть тип запроса в заголовках запросов.
Теперь откройте API в веб-браузере, посетив сайт http://127.0.0.1:8000/snippets/.
Browsability
Поскольку API выбирает тип содержимого ответа на основе запроса клиента, он по умолчанию возвращает представление ресурса в формате HTML, когда ресурс запрашивается веб-браузером. Это позволяет API возвращать полностью доступное для веб-браузера представление HTML.
Наличие browsable API - это огромный выигрыш в удобстве использования, он значительно упрощает разработку и использование вашего API. Это также значительно снижает барьер для входа в систему для других разработчиков, желающих ознакомиться с вашим API и работать с ним.
Дополнительную информацию о функции browsable API и ее настройке см. в теме browsable api.
What's next?
Что дальше?
В уроке 3 мы начнем использовать представления на основе классов и увидим, как общие представления уменьшают количество кода, который нам нужно писать.
Last updated