django rest框架保存base64文件

Posted

技术标签:

【中文标题】django rest框架保存base64文件【英文标题】:django rest framework saving base64 file 【发布时间】:2018-01-27 21:42:48 【问题描述】:

如何在 django rest 框架中处理 base64 文件字段。我正在使用 django 额外字段,但它不起作用。

序列化器.py

from drf_extra_fields.fields import Base64FileField

class ProductSerializer(serializers.ModelSerializer):

    file  = Base64FileField()
    class Meta:
        model = Product

        fields = (
                    "name",
                    "file"
                )



class ProductApi(SerializerMixin, APIView):
    serializer_class = ProductSerializer
    def post(self, request):
        serializer = ProductSerializer(data=request.data)
        if serializer.is_valid():
            return Response("Valid serializer", status=status.HTTP_201_CREATED)
        return Response(
                            serializer.errors, 
                            status=status.HTTP_400_BAD_REQUEST
                        )

但是当我尝试这个时,我得到了这个错误。

Exception Value: 'NotImplementedType' object is not callable

如何使用 django rest 框架将 base64 文件保存在数据库中

【问题讨论】:

【参考方案1】:

如drf-extra-fields docs中所说:

您必须提供该类的您自己的完整实现。您必须在get_file_extension 方法中实现文件验证并设置ALLOWED_TYPES 列表。

您使用默认的Base64FileField,这就是您收到的原因:

Exception Value: 'NotImplementedType' object is not callable

在这种情况下,您需要扩展默认 Base64FileField 并创建自定义字段,以及验证方法 get_file_extension 并将 ALLOWED_TYPES 列表设置为属性。

直接来自文档的示例:

class PDFBase64File(Base64FileField):
    ALLOWED_TYPES = ['pdf']

    def get_file_extension(self, filename, decoded_file):
        try:
            PyPDF2.PdfFileReader(io.BytesIO(decoded_file))
        except PyPDF2.utils.PdfReadError as e:
            logger.warning(e)
        else:
            return 'pdf'

这是PDF 文件的字段。然后在您的ProductSerializer 中,您可以使用新字段:file = PDFBase64FileField()

要支持更多文件类型,请尝试filetype 库。

【讨论】:

文件格式可以是 docs、pdf 或 image 之类的任何东西。那我该如何处理呢 @Thameem 首先,设置ALLOWED_TYPES = ('pdf', 'doc', 'docx', 'jpeg', 'jpg', 'png', ...) 和任何你想要的扩展名。然后,在您的 get_file_extension 方法中执行验证。您已经有了 PDF 验证,由您来实施其他验证。 @wencaksis 能否请您指出以单一方法验证 jpeg 和 pdf 的方法。我该怎么做。 @Thameem 希望这对您有所帮助:***.com/questions/6640605/… 您可以为每种类型实现单独的验证,然后在get_file_extension中调用它们

以上是关于django rest框架保存base64文件的主要内容,如果未能解决你的问题,请参考以下文章

JWT 认证

jwt认证

嵌套 url 不适用于 Django REST 框架

将图像从base64转换为图像并保存在django的数据库中

drf-jwt认证

Django REST框架:在ModelViewSet中保存相关模型