@Lepilov

Для чего применяются парсеры в Django Rest Framework?

Для вывода списка загруженных документов и возможности добавления файлов я использую класс

class DocumentsListView(AwsUrlMixin, viewsets.ViewSetMixin, generics.ListCreateAPIView):
    queryset = Documents.objects.all()
    serializer_class = DocumentsSerializer
    permission_classes = (IsAuthenticated, LifeLinePermissions)
    pagination_class = None

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)


serializers.py
class DocumentsSerializer(AwsUrlMixin, serializers.ModelSerializer):
    type_name = serializers.CharField(source='type.type', read_only=True)
    type = serializers.PrimaryKeyRelatedField(queryset=Doctype.objects.all())
    view_file = serializers.SerializerMethodField()
    author = serializers.CharField(source='author.username', read_only=True)
    created = serializers.DateTimeField(format=date_format, input_formats=None, default_timezone=None, read_only=True)

    class Meta:
        model = Documents
        fields = ('id', 'author', 'filename', 'datafile', 'type', 'type_name', 'created', 'view_file')


models.py

class Documents(models.Model):
    """ uploaded documents"""

    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    upload = models.FileField(storage=PrivateMediaStorage())
    filename = models.CharField(_('documents name'), max_length=255, blank=True, null=True)
    datafile = models.FileField()
    created = models.DateTimeField(auto_now_add=True)
    type = models.ForeignKey(Doctype, on_delete=models.CASCADE, blank=True)


Использую стандартный интерфейс DRF у меня все нормально отображается и добавляются новые файлы в базу.

Читая доки я наткнулся на парсеры, такие как MultipartParser, FileUploadParser, которые так же используются при добавлении новых файлов.
Я не могу панять когда ими надо пользоваться и какую функцию они выполняют, ведь сейчас и без них все работает.

Есть в доках такая фраза
FileUploadParser
используется с native клиентом, который может загружать файл
в виде необработанных запросов. Для web-based загрузок, или для native
клиентов с поддержкой многокомпонентной загрузки, вы должны использовать
парсер MultiPartParser

но она не дала мне четкого понимания контекста использования

Буду благодарен если проясните для меня этот вопрос
  • Вопрос задан
  • 788 просмотров
Решения вопроса 1
werevolff
@werevolff
Открой код парсеров и посмотри:

class JSONParser(BaseParser):
    """
    Parses JSON-serialized data.
    """
    media_type = 'application/json'
    renderer_class = renderers.JSONRenderer
    strict = api_settings.STRICT_JSON

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Parses the incoming bytestream as JSON and returns the resulting data.
        """
        parser_context = parser_context or {}
        encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)

        try:
            decoded_stream = codecs.getreader(encoding)(stream)
            parse_constant = json.strict_constant if self.strict else None
            return json.load(decoded_stream, parse_constant=parse_constant)
        except ValueError as exc:
            raise ParseError('JSON parse error - %s' % str(exc))


class FormParser(BaseParser):
    """
    Parser for form data.
    """
    media_type = 'application/x-www-form-urlencoded'

    def parse(self, stream, media_type=None, parser_context=None):
        """
        Parses the incoming bytestream as a URL encoded form,
        and returns the resulting QueryDict.
        """
        parser_context = parser_context or {}
        encoding = parser_context.get('encoding', settings.DEFAULT_CHARSET)
        return QueryDict(stream.read(), encoding=encoding)


Парсер получает некий контент из HTTPRequest и преобразует его до словаря. Например, попробуй передать данные в твой API в формате YAML. Ты получишь ошибку формата.

Конкретный юзкейс был у меня недавно: платёжная система присылала сообщения о событиях на API проекта. К сожалению, формат данных был с ошибкой, и мне потребовалось наследоваться от парсера JSON и обрабатывать ошибку.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы