Парсеры
источник:
parsers.py
Парсеры
Взаимодействующие с машинами веб-сервисы обычно используют более структурированные форматы для отправки данных, чем данные формы, поскольку они отправляют более сложные данные, чем простые формы
— Malcom Tredinnick, Django developers group
DRF включает ряд встроенных классов Parser
, которые позволяют принимать запросы с различными типами носителей. Также есть поддержка определения собственных парсеров, что дает вам гибкость в определении типов медиа, которые принимает ваш API.
Как определяется синтаксический анализатор
Набор допустимых парсеров для представления всегда определяется как список классов. Когда происходит обращение к request.data
, DRF изучает заголовок Content-Type
входящего запроса и определяет, какой парсер использовать для разбора содержимого запроса.
Примечание: При разработке клиентских приложений всегда помните о том, что при отправке данных в HTTP-запросе нужно обязательно устанавливать заголовок Content-Type
.
Если вы не зададите тип содержимого, большинство клиентов по умолчанию будут использовать 'application/x-www-form-urlencoded'
, что может оказаться не тем, чего вы хотели.
В качестве примера, если вы отправляете закодированные данные json
с помощью jQuery с методом .ajax(), вы должны обязательно включить параметр contentType: 'application/json'
.
Настройка парсеров
Набор парсеров по умолчанию можно задать глобально, используя параметр DEFAULT_PARSER_CLASSES
. Например, следующие настройки разрешают только запросы с содержимым JSON
, вместо стандартного JSON или данных формы.
Вы также можете установить парсеры, используемые для отдельного представления или набора представлений, используя представления на основе класса APIView
.
Или, если вы используете декоратор @api_view
с представлениями, основанными на функциях.
API Reference
JSONParser
Разбирает JSON
содержимое запроса. request.data
будет заполнен словарем данных.
.media_type: application/json
.
FormParser
Разбирает содержимое HTML-формы. request.data
будет заполнен QueryDict
данных.
Для полной поддержки данных HTML-формы обычно требуется использовать FormParser
и MultiPartParser
вместе.
.media_type: application/x-www-form-urlencoded
.
MultiPartParser
Разбирает содержимое многокомпонентной HTML-формы, которая поддерживает загрузку файлов. request.data
и request.FILES
будут заполнены QueryDict
и MultiValueDict
соответственно.
Для полной поддержки данных HTML-формы обычно требуется использовать FormParser
и MultiPartParser
вместе.
.media_type: multipart/form-data
.
FileUploadParser
Разбирает необработанное содержимое загружаемого файла. Свойство request.data
будет представлять собой словарь с единственным ключом 'file'
, содержащим загруженный файл.
Если представление, используемое с FileUploadParser
, вызывается с именованным аргументом URL filename
, то этот аргумент будет использоваться в качестве имени файла.
Если он вызывается без именованного аргумента URL filename
, то клиент должен установить имя файла в HTTP-заголовке Content-Disposition
. Например, Content-Disposition: attachment; filename=upload.jpg
.
.media_type: */*
Примечания:
FileUploadParser
предназначен для использования с собственными клиентами, которые могут загружать файл как запрос необработанных данных. Для веб-загрузки или для собственных клиентов с поддержкой многочастной загрузки вместо него следует использоватьMultiPartParser
.Поскольку
media_type
этого парсера соответствует любому типу содержимого,FileUploadParser
обычно должен быть единственным парсером, установленным в представлении API.FileUploadParser
учитывает стандартную настройку DjangoFILE_UPLOAD_HANDLERS
и атрибутrequest.upload_handlers
. Более подробную информацию смотрите в документации Django.
Базовый пример использования:
Пользовательские синтаксические анализаторы
Для реализации пользовательского парсера необходимо переопределить BaseParser
, установить свойство .media_type
и реализовать метод .parse(self, stream, media_type, parser_context)
.
Метод должен возвращать данные, которые будут использоваться для заполнения свойства request.data
.
Аргументами, передаваемыми в .parse()
, являются:
stream
Потокоподобный объект, представляющий тело запроса.
media_type
Необзательно. Если указано, это тип носителя содержимого входящего запроса.
В зависимости от заголовка Content-Type:
запроса, он может быть более конкретным, чем атрибут media_type
рендерера, и может включать параметры типа медиа. Например, "text/plain; charset=utf-8"
.
parser_context
Необзательно. Если этот аргумент указан, то он будет представлять собой словарь, содержащий любой дополнительный контекст, который может потребоваться для разбора содержимого запроса.
По умолчанию сюда входят следующие ключи: view
, request
, args
, kwargs
.
Пример
Ниже приведен пример анализатора обычного текста, который заполнит свойство request.data
строкой, представляющей тело запроса.
Пакеты сторонних производителей
Также доступны следующие пакеты сторонних производителей.
YAML
REST framework YAML обеспечивает поддержку разбора и рендеринга YAML. Ранее он был включен непосредственно в пакет DRF, а теперь поддерживается как сторонний пакет.
Установка и настройка
Установите с помощью pip.
Измените настройки DRF.
XML
REST Framework XML предоставляет простой неформальный формат XML. Ранее он был включен непосредственно в пакет DRF, а теперь поддерживается как сторонний пакет.
Установка и настройка
Установите с помощью pip.
Измените настройки DRF.
MessagePack
MessagePack - это быстрый и эффективный формат двоичной сериализации. Juan Riaza поддерживает пакет djangorestframework-msgpack, который обеспечивает поддержку рендеринга и парсера MessagePack для DRF.
CamelCase JSON
djangorestframework-camel-case предоставляет рендереры и парсеры JSON в верблюжьем регистре для DRF. Это позволяет сериализаторам использовать имена полей в стиле Python с подчеркиванием, но отображать их в API как имена полей в верблюжьем регистре в стиле Javascript. Поддерживается Виталием Бабием.
Last updated