在 Django Rest Framework 中接收 Base64 编码的图像并保存到 ImageField

Posted

技术标签:

【中文标题】在 Django Rest Framework 中接收 Base64 编码的图像并保存到 ImageField【英文标题】:Receive a Base64 encoded image in Django Rest Framework and save into ImageField 【发布时间】:2013-05-07 13:18:07 【问题描述】:

我需要从应用程序接收图像,我能想到的最好方法是将其发送到以 Base64 编码的 JSON 数组中。图像非常小,所以我不在乎额外的开销。

我有一个模型:

class Observation(models.Model):    
    ...
    sonogram_image = models.ImageField(upload_to=sonogram_dir)

及其序列化器:

class ObsvSerializerNoDetect(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Observation

我应该把解码图像的代码放在哪里?

【问题讨论】:

你有没有想过这个问题? 是和不是。我将图像存储为文本,然后将其渲染到网页非常容易,在您放置 src="data:image/png;base64,<your base64 string here>"img 标记中。我不确定这是不是最好的方法,但它工作正常且易于实施。 @gozzilli 您能否提供基于 base64 的解决方案的视图/序列化器/模型的片段? 我的回答可能对你有所帮助:***.com/questions/25027093/… 【参考方案1】:

这是在基于 Django(也称为 drf)的 API 端的发布请求中处理 Base64 编码图像文件的方法,该 API 将其保存为 ImageField。

假设你有一个模型如下:

Class MyImageModel(models.Model):
      image = models.ImageField(upload_to = 'geo_entity_pic')
      data=model.CharField()

所以对应的序列化器如下:

 from drf_extra_fields.fields import Base64ImageField

 Class MyImageModelSerializer(serializers.ModelSerializers):
      image=Base64ImageField() # From DRF Extra Fields
      class Meta:
         model=MyImageModel
         fields= ('data','image')
      def create(self, validated_data):
        image=validated_data.pop('image')
        data=validated_data.pop('data')
       return MyImageModel.objects.create(data=data,image=image)

对应的View可以如下:

elif request.method == 'POST':
    serializer = MyImageModelSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=201)
    return Response(serializer.errors, status=400)

注意在序列化器中我使用了模块django-extra-field中提供的Base64ImageField实现

要安装此模块,请运行命令

pip install django-extra-fields

导入相同并完成!

将您的图像作为 JSON 对象中的 Base64 编码字符串连同您拥有的任何其他数据一起发送(通过 post 方法)。

【讨论】:

【参考方案2】:

试试django extra fields。使用Base64ImageField 作为序列化器字段当然假设您在模型中使用了ImageField

【讨论】:

【参考方案3】:

可能有两个最佳位置,具体取决于您的用例:

    在您的序列化程序中,您可以为您的字段覆盖validate_Xtransform_X 方法(请参阅validation docs)并在此处进行双向转换。

    如果您更频繁地需要该功能,请编写自己的 custom field。您只需在to_nativefrom_native 中定义转换在两个方向上的运行方式。也许扩展原始 DRF ImageField 以保持使用 PIL 进行图像数据验证。

更新 DRF3:

transform_X 方法替换为to_representation()。请参阅removal-of-transform_field_name 和Overriding serialization and deserialization behavior 。

还请查看此 DRF Base64ImageFieldMixin 示例。

【讨论】:

以上是关于在 Django Rest Framework 中接收 Base64 编码的图像并保存到 ImageField的主要内容,如果未能解决你的问题,请参考以下文章

django使用rest_framework

Django Rest Framework

Django rest framework 身份和权限验证

Django Rest Framework:非模型服务

django-rest-framework - 在可浏览的 API 中自动生成表单?

在 django-rest-framework 中,是不是可以同时使用 oauth 和 session 身份验证?