【问题标题】:django rest framework saving base64 filedjango rest框架保存base64文件
【发布时间】: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 文件保存在数据库中

【问题讨论】:

    标签: django django-rest-framework


    【解决方案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 希望这对您有所帮助:stackoverflow.com/questions/6640605/… 您可以为每种类型实现单独的验证,然后在get_file_extension中调用它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2022-06-25
    • 2015-10-04
    • 2013-12-26
    相关资源
    最近更新 更多