python - 使用序列化程序从 URL 保存图像

标签 python django http request django-rest-framework

我正在创建一个将图像保存在 Django 模型中的 API。通过 API 发送一个 URL,django 负责下载图像并将其保存在模型中。

这是我的模型:

class Picture(Media):
    image = models.ImageField(upload_to=picture_path, blank=True, null=True)
    entity = models.CharField(max_length=20, choices=ENTITIES,
                          default=ENTITY_CLASIFICADO)

这是我的序列化器:

class PictureSerializer(serializers.ModelSerializer):
    image = serializers.ImageField(max_length=None, use_url=True)

    class Meta:
        model = Picture
        fields = ("pk", "image", "entity",)

我从 URL 生成一个 PIL 对象。如何指定存储对象的序列化程序?我的观点.py

class PictureViewSet(generics.ListCreateAPIView):
    def create(self, request, *args, **kwargs):
        r = requests.get(request.data["url"])
        img_temp = NamedTemporaryFile(delete = True)
        img_temp.write(r.content)

现在,我要保存空图像字段。

serializer = self.get_serializer(data=request.data)

我想将 PIL 对象添加到 request.data 中,它看起来像这样:

<QueryDict: {'url': ['https://s3.amazonaws.com/cat/encabezado.jpg'], 'image': ['MY PIL IMAGE'], 'entity': ['clasificado'], 'csrfmiddlewaretoken': ['JRMLIXkxqg6sF5YP19NLTvgFOmVWH9ARSmM']}>

谢谢!

最佳答案

你可以直接在序列化器中做到这一点
所以基本上它是现实生活中的工作示例,请注意我们在 attrs 中设置图像时需要将其设置为相对路径。
您还需要检查响应状态,但这由您决定)

import os, uuid, requests
from django.conf import settings
from rest_framework.serializers import ModelSerializer
from .models import Audio

class AudioCreateSerializer(ModelSerializer):
    class Meta:
        model = Audio
        fields = ['image']

    def validate(self, attrs):
        url = "http://youurlgoeshere.com/sddsjdsjdsjds.png"
        data = requests.get(url)
        response = requests.get(image_url)
        random_name = uuid.uuid4().hex + ".png"
        folder_name = "custom_images"
        absolute_file_path = os.path.join(settings.MEDIA_ROOT, folder_name, random_name)
        relative_path = os.path.join(folder_name, random_name)
        with open(absolute_file_path, 'wb') as f:
            f.write(response.content)
        attrs['image'] = relative_path
        return attrs

此外,我将在这里留下如何定义 View

class AudioListView(ListCreateAPIView):
    renderer_classes = [JSONRenderer]
    queryset = Audio.objects.select_related("artist")

    def get_serializer_class(self):
        if self.request.method == "GET":
            return AudioListSerializer
        if self.request.method == "POST":
            return AudioCreateSerializer

关于python - 使用序列化程序从 URL 保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45464064/

相关文章:

python - 创建用户相关信息模型

flash - 阻止 flash 访问 http 资源

android - 在 Android 中模拟 HTML 表单

python - 为 Python 记录器格式化输出编写单元测试

python分散阈值函数不起作用

python - 使用django在网页上传递错误信息

python - Django/HTML 提交按钮重定向到错误页面

java - 通过 HTTPConnection 下载大文件 - JAVA Applet

python:你如何在 Ubuntu 上设置你的工作区?

使用 disutils 的 setup.py 在 Linux 上进行 Python 打包并进行许多导入