在djangorest框架中使用postman上传图像时出错

2024-03-23

我正在尝试创建一个端点,以使用 django 休息框架将图像(使用邮递员)上传到特定文件夹。这是我对文件夹的设置,

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

这是我的模型,

class UserMedia(models.Model):
    user = models.OneToOneField(User, related_name='medias', on_delete=models.CASCADE, )
    profile_image_web = models.FileField(null=True)
    profile_image_android = models.FileField(null=True)
    profile_image_ios = models.FileField(null=True)
    thumbnail = models.FileField(null=True)

这是序列化器,

class UserMediaSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserMedia
        fields = (
            'profile_image_web', 'profile_image_ios', 'profile_image_android', 'thumbnail',
        )

这是API,

class CreateUpdateUserMedia(views.APIView):
    parser_classes = (MultiPartParser, FormParser)

    def post(self, request, **kwargs):
        serializer = UserMediaSerializer(request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

现在,当我尝试使用 POSTMAN 上传与其中一个字段对应的一张图像时,这是我收到的错误。

'Cannot call `.is_valid()` as no `data=` keyword argument was '
AssertionError: Cannot call `.is_valid()` as no `data=` keyword argument was passed when instantiating the serializer instance.

这是完全可以理解的,但我不知道如何解决它。

这是我的问题,

  1. 如何使用 django Rest 框架正确上传图像。

  2. 我不希望这个 api 被 4 个图像一起调用,而是一次使用一张图像 4 次,我如何传递相关名称和 相应地修改序列化器。

  3. 如何提供根媒体目录的子路径。

  4. 最后我希望序列化程序显示完整的图像网址,我该怎么做?


您正在使用serializer = UserMediaSerializer(request.data)但你应该这样称呼它serializer = UserMediaSerializer(data=request.data)

要在 Django Rest 框架中上传图像,您应该在 S3 上上传图像并在 DRF API 中传递 s3 url,或者在序列化程序中使用 Base64 字段并在 API 中发送图像的 Base64 编码值

import uuid
import base64
import imghdr

from django.utils.translation import ugettext_lazy as _
from django.core.files.base import ContentFile
from rest_framework import serializers


ALLOWED_IMAGE_TYPES = (
    "jpeg",
    "jpg",
    "png",
    "gif"
)


class Base64ImageField(serializers.ImageField):
    """
        A django-rest-framework field for handling image-uploads through raw post data.
        It uses base64 for en-/decoding the contents of the file.
        """

    def to_internal_value(self, base64_data):
        # Check if this is a base64 string
        if not base64_data:
            return None

        if isinstance(base64_data, basestring):
            # Try to decode the file. Return validation error if it fails.
            try:
                decoded_file = base64.b64decode(base64_data)
            except TypeError:
                raise serializers.ValidationError(_("Please upload a valid image."))
            # Generate file name:
            file_name = str(uuid.uuid4())[:12]  # 12 characters are more than enough.
            # Get the file name extension:
            file_extension = self.get_file_extension(file_name, decoded_file)
            if file_extension not in ALLOWED_IMAGE_TYPES:
                raise serializers.ValidationError(_("The type of the image couldn't been determined."))
            complete_file_name = file_name + "." + file_extension
            data = ContentFile(decoded_file, name=complete_file_name)
            return super(Base64ImageField, self).to_internal_value(data)
        raise serializers.ValidationError('This is not an base64 string')

    def to_representation(self, value):
        # Return url including domain name.
        return value.name

    def get_file_extension(self, filename, decoded_file):
        extension = imghdr.what(filename, decoded_file)
        extension = "jpg" if extension == "jpeg" else extension
        return extension

Updated

您应该对图像使用 ImageField (而不是 FileField)。

您可以像任何其他字段一样直接在序列化器中使用上述字段。

class UserMediaSerializer(serializers.ModelSerializer):
    profile_image_web = Base64ImageField(required=False)
    class Meta:
        model = models.UserMedia
        fields = ('profile_image_web', 'profile_image_ios', 'profile_image_android', 'thumbnail') 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在djangorest框架中使用postman上传图像时出错 的相关文章

随机推荐

  • 如何打印密码组合(但每个索引都有自定义约束)

    我正在尝试构建一个动态密码恢复工具 您可以指定密码以及与未知密码索引对应的未知字符列表 因此 如果您记住了 90 的密码 并且记不住几个字母 这将为您提供轻量级的暴力破解 我能够将用户提供的密码与未知字符列表结合起来 但是 我一直试图打印每
  • 禁用 mp3 自动播放

    我尝试禁用自动播放但没有成功 这是我的代码 失败的尝试 去除autoplay完全地 改变autoplay to autostart and AutoStart setting autoplay autostart AutoStart to
  • Reactable R - 将每页最大行数从 10 更改为 5

    我想将每页可反应的行数限制为 10 到 5 这是一个可重现的示例 set seed 250 df lt tibble x sample x 1 20 reactable df 现在 当您运行此代码时 会出现两页 每页 10 行 我想要四页
  • 正则表达式将 npm 库排除在缩小范围之外

    我必须为 websockets 使用非开源发布 订阅库 扩散 https www npmjs com package diffusion v 5 9 2 并且必须坚持使用特定版本 因为它是在服务器端使用的 我无法控制它 问题在于 在其代码库
  • 无法在 asp.net 中的 webmethod 中获取会话

    我只是发现问题与webmethod无关 这是由另一个问题引起的 我设置了Session PhotoId 在正常的 aspx 中 但我无法检索其中的值webMethodaspx 页面的 WebMethod EnableSession true
  • Windows C# 实现linux dd 命令

    我正在编写一个在 Windows 上运行的 C Net 应用程序 它需要拍摄可移动磁盘的映像并将其放入 Linux Live USB 上 Live USB 被插入目标机器并启动 启动时它会运行一个脚本 该脚本使用 dd 命令 如下所示将其闪
  • 如何从Python数据框中的列列表中删除重复项?

    我有一个数据框 id rev names 34e A su ra ve ra de ra 45e R ra su su ve de 55e G su ra de 41e M su de mu er su 现在我需要删除重复项 输出应如下所示
  • 更改 intellij 窗格的背景颜色

    我更改了 intellij 中的配色方案 以便 Java 编辑器窗格的背景为深色 文本为浅色 我不确定这是否直接相关 但是 在其他窗口 例如 运行 窗口 中 背景保持白色 但任何系统消息都显示为白色文本 这显然是一个问题 因为我无法阅读白色
  • JSF 在“ui:include src="#{bean.pagePath}”中动态包含 src

    我尝试在不同的选项卡中使用 ui include 标签包含多个源页面路径 问题是 当我将源页面路径指定为静态时 意味着将显示该页面 但如果从支持 bean 指定源页面路径 则意味着它将不包含该页面 这是我的代码 template xhtml
  • Z3 求解器中 MAxSMT 和用户定义成本函数的组合

    我正在使用 Z3 来优化带有一些软约束 带有加权 MaxSMT 的成本函数 我很好奇 MaxSMT 和用户定义的成本函数如何交互 求解器是否最小化 MaxSMT 成本和目标函数两者 是否有优先级机制 我找不到这方面的任何文档 如果我遗漏了什
  • NSUserDefaults 中可以存储的对象的最大大小

    谁能告诉我 NSUserDefaults 的最大大小 意味着我们可以存储在用户默认值中的对象或基元 例如 10 MB 等 Thanks 不 除了设备本身的存储容量之外 NSUserDefaults 没有大小限制 see
  • 编写django应用程序时的缩进标准

    我使用 notepad 作为编辑器 我发现使用选项卡时更容易跟踪代码中的关系 1 在 django 代码中缩进 制表符或空格 的标准是什么 2 除了notepad 之外 您还推荐其他代码编辑器吗 一定要遵循 PEP8 请加空格 并遵循 dj
  • 无法在 Safari 上运行测试 - 我们需要开发证书吗

    我正在尝试在 Safari 上运行量角器测试 在研究过程中 我了解到使用 Protractor 时无需下载任何特定于 Safari 的任何内容 因为驱动程序已附带 当尝试运行我的测试时 我收到 No Safari driver found
  • PHP 5.3.8 上的 Mime 类型检测失败并显示 fileinfo

    我在 CentOS 服务器上安装了 PHP 5 3 8 时 无法使用 fileinfo 检测简单 PNG 文件的 mime 类型 问题 基本上 如果我有以下代码 如您所见 该文件是 PNG 图像 文件的头字节已被检查并
  • 从 WebResponse 读取响应的最简单方法

    private void RespCallback IAsyncResult asynchronousResult try WebRequest myWebRequest1 WebRequest asynchronousResult Asy
  • Hibernate:未配置 CurrentSessionContext

    我不断收到 Hibernate异常 否 CurrentSessionContext已配置 在我的代码中 其他搜索返回的唯一信息是罪魁祸首是
  • 以编程方式在 iOS 中设置全屏模式

    如何以编程方式将 iPad 的 iOS 应用程序设置为全屏 你说的是可见的状态栏吗 在应用程序的 info plist 中 您可以添加一个新条目 UIStatusBarHidden 并确保其已选中 这将确保状态栏被隐藏 您还必须确保您的视图
  • 如何在 SOLR 中索引 .html 文件

    我想要索引的文件存储在服务器上 我不需要抓取 路径 到 文件 示例 HTML 文件是
  • 将列表值插入 MySQL 查询的 %s 时出现“mysql.connector.errors.ProgrammingError:并非所有参数都在 SQL 语句中使用”

    我一直对这段代码有疑问 我正在尝试制作一个带有 2 个输入框 一个手机框和一个密码框的登录页面 手机是 MySQL 表中的主键 import tkinter as tk import re import mysql connector as
  • 在djangorest框架中使用postman上传图像时出错

    我正在尝试创建一个端点 以使用 django 休息框架将图像 使用邮递员 上传到特定文件夹 这是我对文件夹的设置 MEDIA URL media MEDIA ROOT os path join BASE DIR media 这是我的模型 c