Разница между JSONParser и JSONRenderer

Я проходил через Джанго остальные рамки учебника о сериализации, в которой я застрял в JSONRenderers и JSONParsers.Ниже приведен код, упомянутый там:

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser
from django.utils.six import BytesIO

snippet = Snippet(code='foo = "bar"\n')
snippet.save()

snippet = Snippet(code='print "hello, world"\n')
snippet.save()
serializer = SnippetSerializer(snippet)
serializer.data
# {'pk': 2, 'title': u'', 'code': u'print "hello, world"\n', 'linenos': False, 'language': u'python', 'style': u'friendly'}
content = JSONRenderer().render(serializer.data)
content
# '{"pk": 2, "title": "", "code": "print \"hello, world\"\n", "linenos": false, "language": "python", "style": "friendly"}'

stream = BytesIO(content)
data = JSONParser().parse(stream)

Я знаю, что JSONParser используется для десериализации данных , а JSONRenderer используется для сериализации, но у меня все еще нет правильного понимания разницы между сериализацией и десериализацией данных. Может кто-нибудь дать мне clear понимание этого.(Ответ с примером высоко ценится.)

а также как работает JSONRenderer и JSONParser?

1 ответов


С viewsets. View и viewsets-это классы в DRF, где происходит большая часть логики приложения.

например. ModelViewSet-класс, ответственный за операции CRUD в ответ на методы POST, PUT, PATCH, GET, DELETE HTTP.

давайте рассмотрим метод создания по умолчанию из https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/mixins.py Этот метод создает экземпляр вашей модели из данных (если они допустимы) отправить через метод HTTP POST и сохранить их в базе данных.

def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

def perform_create(self, serializer):
        serializer.save()

Это то, что происходит здесь.

self.get_serializer() создайте новый экземпляр сериализатора (вы установили класс сериализатора раньше), он принимает запрос.данные как аргумент. запрос.данные (это важно)словарь. Словарь общая структура данных python.

сериализатор.is_valid () метод проверяет если запрос.данные являются действительными. Если да, вы можете получить доступ к сериализатору.данные - также словарь.

сериализатор.save () метод создает и сохраняет фактический экземпляр вашей модели (фрагмент) в базе данных. Вы можете напрямую получить доступ к экземпляру, как это

instance = serializer.save()

затем вы возвращаете объект ответа, заполненный сериализатором.данные возвращаются клиенту.

как вы можете видеть, есть нет данные по формы, JSON, XML, HTML etc. в viewset. Вы работаете с данными python типы и сериализатор отвечают за" перевод " словаря в экземпляр вашей конкретной модели и обратно. Но клиент отправляет данные (в вашем случае) в HTTP-запросе в виде JSON.

JSONParser отвечает за преобразование JSON в словарь. Синтаксический анализ реализуется внутри класса request https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/request.py, обратите внимание, что это не стандартный Django HttpRequest модель.

вы можете установить несколько анализаторов, затем запрос выберет правильный в соответствии с заголовком HTTP-запроса: Content-type.

во-вторых, вы должны вернуть сериализатор.данные возвращаются клиенту в виде JSON, а не словаря. Вот что!--4-->JSONRenderer делает. Он преобразует dict в JSON и реализован внутри класса ответа https://github.com/tomchristie/django-rest-framework/blob/master/rest_framework/response.py - ... Также вы можете установить несколько визуализаторов, а затем правильный выбор в соответствии с принятым типом носителя http-заголовка.

пример полного определения viewset может быть:

from snippets.models import Snippet
from snippets.serializers import SnippetSerializer
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser


class SnippetViewSet(viewsets.ModelViewSet):

    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
    renderer_classes = (JSONRenderer, )
    parser_classes = (JSONParser,)