在Django REST Framework(DRF)中,如何支持对base64
编码的二进制数据进行反序列化?
我有一个模特:
class MyModel(Model):
data = models.FileField(...)
我希望能够将此数据作为base64编码发送,而不是必须使用多部分表单数据或“文件上载”。查看Parsers
,只有FileUploadParser
和MultiPartParser
似乎会解析文件。
我希望能够以JSON之类的方式发送此数据(即在data
而不是files
中发送二进制数据:
{
'data':'...'
}
答案 0 :(得分:3)
我通过创建新的Parser
:
def get_B64_JSON_Parser(fields):
class Impl(parsers.JSONParser):
media_type = 'application/json+b64'
def parse(self, *args, **kwargs):
ret = super(Impl, self).parse(*args, **kwargs)
for field in fields:
ret[field] = SimpleUploadedFile(name=field, content=ret[field].decode('base64'))
return ret
return Impl
然后我在View
中使用
class TestModelViewSet(viewsets.ModelViewSet):
parser_classes = [get_B64_JSON_Parser(('data_file',)),]
答案 1 :(得分:2)
这是一个老问题,但对于那些寻找最新解决方案的人来说,有一个DRF插件(drf_base64)来处理这种情况。它允许在JSON请求中读取编码为base64字符串的文件。
所以给出了一个类似的模型:
class MyModel(Model):
data = models.FileField(...)
和预期的json如:
{
"data": "data:image/png;base64,iVBORw0KGgoA ....",
...
}
只能从drf_base模块而不是drf本身导入(des)序列化。
来自drf_base64.serializers的导入ModelSerializer 来自.models导入MyModel
class MyModel(ModelSerializer):
class Meta:
model = MyModel
请记住,使用FileReader API在javascript中获取base64编码文件是可行的。
答案 2 :(得分:0)
你可以在序列化程序级别做一些聪明的事情,但首先想到的是在视图中做到这一点。
第1步:写入文件。类似的东西:
fh = open("/path/to/media/folder/fileToSave.ext", "wb")
fh.write(fileData.decode('base64'))
fh.close()
第2步:在模型上设置文件。类似的东西:
instance = self.get_object()
instance.file_field.name = 'folder/fileToSave.ext' # `file_field` was `data` in your example
instance.save()
请注意步骤1的绝对路径和步骤2中相对于媒体文件夹的路径。
这至少应该让你前进。
理想情况下,您可以将其指定为序列化字段,并免费获得模型实例的验证和自动分配。但乍一看似乎复杂。