Django Rest 框架中使用的解析器是啥?

Posted

技术标签:

【中文标题】Django Rest 框架中使用的解析器是啥?【英文标题】:What are the parsers used for in the Django Rest Framework?Django Rest 框架中使用的解析器是什么? 【发布时间】:2020-01-01 11:39:17 【问题描述】:

我有一个简单的文件模型

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 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,没有任何改变。一切都像以前一样工作。 如果你能对我说清楚,我将不胜感激。

【问题讨论】:

阅读this了吗?如果是这样,您将看到解析器是全局设置的,或者可以在视图中覆盖(而不是在序列化器中)。他们基本上确保视图接收到的请求正文被解析并转换为可由序列化程序处理的python对象(通常是字典),反之亦然。请让我们知道您具体不了解本文档的哪一部分。 @dirkgroten 我写错了,我将 parser_classes 添加到序列化程序中,当然是在视图中。我不清楚在没有解析器的情况下是否一切正常,为什么我需要它们,何时必须将它们添加到视图中,什么时候可以不使用它们?将解析器添加到视图后发生了什么变化? 【参考方案1】:

Django REST 中的解析器用于解析传入的 HTTP 请求的内容。在 HTTP 请求中,我们以字符串格式接收数据。解析器将根据 HTTP 请求中收到的 Content-Type 标头将 HTTP 内容解析为 python 数据类型。 Django REST Framework 提供了许多内置的解析器,它们根据 HTTP 请求中接收到的 Content-Type 标头解析不同类型的内容,如 application/jsonmultipart/form-dataapplication/xml 等。

Django REST 中的解析器类:

JSONParser

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

FormParser

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

MultiPartParser

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

文件上传解析器

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

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

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

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

【讨论】:

【参考方案2】:

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

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

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

假设您必须与使用 SOAP(上帝保佑...)的老式 API(通常是企业)集成,那么您必须引入自己的解析器。

【讨论】:

谢谢,我想它越来越清楚了。是否可以考虑,对于通常的文件发送,例如在编写 API 以在 SPA 中进一步使用时,可以不直接添加解析器? 是的,一般来说你不需要对解析器做任何事情,大多数现代 SPA 框架,如 angular、react/axios、vue 只需使用 DRF 开箱即用处理的标准内容类型. 你好@dirkgroten 你能帮我吗?你似乎对此有很好的理解。 ***.com/questions/68002738/…

以上是关于Django Rest 框架中使用的解析器是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django rest 框架在两个 api 之间配置身份验证的最佳方法是啥?

Json解析django rest框架

python-django rest framework框架之解析器

Python 中最宽容的 HTML 解析器是啥?

在 django rest api 中使用 POST 解析 Json 错误

django框架学习六:优化views.py文件,使用rest_framework中的APIVew和Response返回