Руководство по API платформы Django REST (7): анализ

задняя часть Python Django

Руководство по 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.dataRest 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',
    )
}

Вы также можете использовать на основе классов (API​​View) в представлении, которое задает распознаватель для одного представления или набора представлений.

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

дружеское напоминание

Лучше читать с исходным кодом