Django Rest Framework 中使用的解析器是什么?

What are the parsers used for in the Django Rest Framework?

我有一个简单的文件模型

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)

要显示上传文件列表和添加新文件,我使用 class

class DocumentsListView(viewsets.ViewSetMixin,generics.ListCreateAPIView):
    queryset = Documents.objects.all()
    serializer_class = DocumentsSerializer

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

serializer.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')

我使用标准的DRF界面,我正常显示所有内容,并向数据库添加新文件。

在阅读文档时,我遇到了 MultipartParser、FileUploadParser 等解析器,它们在添加新文件时也会用到。 我无法理解何时使用它们以及它们执行什么功能,因为现在没有它们一切正常。

文档没有让我清楚地了解何时需要使用解析器。

我尝试添加

parser_classes = (MultiPartParser, FileUploadParser)

到 views.py 没有任何变化。一切都像以前一样工作。 如果你能向我解释清楚,我将不胜感激。

解析器帮助您的视图解析以特定格式提交的数据。基本上,它们将 HTTP 请求的 Content-Type header 映射到将该类型解析为您的 Serializer 可以理解的 python 结构所需的代码。

如果您提交 here 所列内容类型的内容,则无需执行任何操作,也无需向视图添加任何解析器。 DRF 已将这些解析器用于这些内容类型。

仅当您的客户打算以不同的形式提交数据时,例如在XML或yaml中,是否需要添加自己的解析器,其中很多已经有人写好了,可以在网上找到。将您提到的解析器添加到视图中没有执行任何操作的原因是它们已经是 DRF 使用的默认值。

所以假设您必须与使用 SOAP 的 old-fashioned API(通常是企业)集成(上帝保佑...)然后您必须引入自己的解析器。

Django REST 中的解析器用于解析传入 HTTP 请求的内容。在 HTTP 请求中,我们以字符串格式接收数据。解析器将根据 HTTP 请求中收到的 Content-Type header 将 HTTP 内容解析为 python 数据类型。 Django REST Framework 提供了多个 built-in 解析器,可以根据 Content-Type header 在 HTTP 请求中收到。

Django REST 中的解析器 类:

  • JSON解析器

    • 它将传入请求 JSON 内容解析为 python 内容类型字典。
    • 当“Content-Type”设置为“application/json”时使用。
  • FormParser

    • 它将传入的请求表单内容解析为 QueryDict。
    • 当“Content-Type”设置为“application/x-www-form-urlencoded”时使用。
  • MultiPartParser

    • 它将传入的请求表单内容解析为 QueryDict。
    • 当“Content-Type”设置为“multipart/form-data”时使用。
    • request.data 将是一个包含所有表单参数的 QueryDict
    • request.files 将是一个包含所有表单文件的 QueryDict
    • FormParser 和 MultiPartParser 一起用于完全支持 HTML 表单数据。
  • FileUploadParser

    • 用于解析HTTP请求中发送的单个文件。

    • 它需要一个 url 关键字参数“文件名”。如果未提供,那么我们应该在 Content-Disposition HTTP header 中提供文件名。例如Content-Disposition:附件;文件名=upload.jpg.

    • request.file用于访问上传文件的内容

参考:https://learnbatta.com/blog/parsers-in-django-rest-framework-85/