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文件的主要内容,如果未能解决你的问题,请参考以下文章