Руководство по API платформы Django REST (1): запросы
Руководство по API платформы Django REST (2): ответы
Руководство по API платформы Django REST (3): представления
Руководство по API платформы Django REST (4): общие представления
Руководство по API платформы Django REST (5): наборы представлений
Руководство по API платформы Django REST (6): Маршрутизация
Руководство по API платформы Django REST (7): анализ
парсер
Фреймворк REST включает в себя ряд встроенных классов парсеров, которые позволяют принимать запросы различных типов носителей. Также поддерживаются пользовательские синтаксические анализаторы, что дает вам гибкость при разработке типов мультимедиа, которые принимает API.
Как определить, какой парсер использовать
Набор допустимых распознавателей для представления всегда определяется как список классов. при посещенииrequest.data
Rest Framework проверит входящий запросContent-Type
и определите, какой парсер использовать для анализа контента запроса.
Уведомление: При разработке клиентского приложения важно следить за тем, чтобы при отправке данных в HTTP-запросе
Content-Type
.
Если вы не установите тип содержимого, большинство клиентов по умолчанию будут использовать'application / x-www-form-urlencoded'
, что, вероятно, не то, что вы хотите. Например, если вы используете jQuery и.ajax()
способ отправкиjson
данные, вы должны обязательно включитьcontentType:'application/json'
настраивать.
установить парсер
можно использоватьDEFAULT_PARSER_CLASSES
Установите глобальный преобразователь по умолчанию. Например, следующие настройки позволят толькоJSON
Запрос содержимого вместо стандартного JSON или данных формы.
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
)
}
Вы также можете использовать на основе классов (APIView
) в представлении, которое задает распознаватель для одного представления или набора представлений.
from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from rest_framework.views import APIView
class ExampleView(APIView):
"""
A view that can accept POST requests with JSON content.
"""
parser_classes = (JSONParser,)
def post(self, request, format=None):
return Response({'received data': request.data})
или и@api_view
Декораторы используются вместе.
from rest_framework.decorators import api_view
from rest_framework.decorators import parser_classes
from rest_framework.parsers import JSONParser
@api_view(['POST'])
@parser_classes((JSONParser,))
def example_view(request, format=None):
"""
A view that can accept POST requests with JSON content.
"""
return Response({'received data': request.data})
Справочник по API
JSONParser
Разберите содержимое запроса JSON.
.media_type:application/json
FormParser
Разобрать содержимое HTML-формы.request.data
ЯвляетсяQueryDict
Словарь, содержащий все параметры формы.
обычно нужно использовать вместеFormParser
иMultiPartParser
, чтобы полностью поддерживать данные форм HTML.
.media_type:application/x-www-form-urlencoded
MultiPartParser
Анализировать содержимое составной HTML-формы для загрузки файлов.request.data
ЯвляетсяQueryDict
(который содержит параметры формы и файлы).
обычно нужно использовать вместеFormParser
иMultiPartParser
, чтобы полностью поддерживать данные форм HTML.
.media_type:application/form-data
FileUploadParser
Разберите содержимое загрузки файла.request.data
ЯвляетсяQueryDict
(содержит только один файл с'file'
ключ).
если сFileUploadParser
Представление, используемое вместе, заключается в использованииfilename
Аргумент ключевого слова URL, то этот аргумент будет использоваться в качестве имени файла.
если нетfilename
аргументы ключевого слова URL, клиент долженContent-Disposition
Установите имя файла в заголовке HTTP. НапримерContent-Disposition: attachment; filename=upload.jpg
.
.media_type:*/*
Пожалуйста, обрати внимание:
-
FileUploadParser
Для локальных клиентов файлы могут быть загружены как запросы необработанных данных. Для веб-загрузок или для локальных клиентов с поддержкой многокомпонентной загрузки следует использоватьMultiPartParser
парсер. - Из-за этого парсера
media_type
соответствует любому типу контента, поэтомуFileUploadParser
Обычно должен быть единственным распознавателем, установленным в представлении API. -
FileUploadParser
Следуйте стандарту DjangoFILE_UPLOAD_HANDLERS
установить иrequest.upload_handlers
Атрибуты. См. документацию Django для получения более подробной информации.
Пример базового использования:
# views.py
class FileUploadView(views.APIView):
parser_classes = (FileUploadParser,)
def put(self, request, filename, format=None):
file_obj = request.data['file']
# ...
# do some stuff with uploaded file
# ...
return Response(status=204)
# urls.py
urlpatterns = [
# ...
url(r'^upload/(?P<filename>[^/]+)$', FileUploadView.as_view())
]
пользовательский синтаксический анализ
Чтобы реализовать собственный парсер, нужно наследовать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
Атрибуты.
class PlainTextParser(BaseParser):
"""
Plain text parser.
"""
media_type = 'text/plain'
def parse(self, stream, media_type=None, parser_context=None):
"""
Simply return a string representing the body of the request.
"""
return stream.read()
сторонний пакет
Ниже перечислены доступные сторонние пакеты.
YAML
REST framework YAMLОбеспечивает синтаксический анализ и поддержку рендеринга YAML. Ранее он был включен непосредственно в пакет инфраструктуры REST, а теперь как сторонний пакет.
Установить и настроить
Установить с помощью pip.
$ pip install djangorestframework-yaml
Измените настройки фреймворка REST.
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
'rest_framework_yaml.parsers.YAMLParser',
),
'DEFAULT_RENDERER_CLASSES': (
'rest_framework_yaml.renderers.YAMLRenderer',
),
}
XML
REST Framework XMLПредоставляет простой неформальный формат XML. Ранее он был включен непосредственно в пакет инфраструктуры REST, а теперь как сторонний пакет.
Установить и настроить
Установить с помощью pip.
$ pip install djangorestframework-xml
Измените настройки фреймворка REST.
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': (
'rest_framework_xml.parsers.XMLParser',
),
'DEFAULT_RENDERER_CLASSES': (
'rest_framework_xml.renderers.XMLRenderer',
),
}
MessagePack
CamelCase JSON
дружеское напоминание
Лучше читать с исходным кодом