Django `ImageFile.read()`引发`bytes`对象没有属性`read`

mzillmmw  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(159)

这是我使用的模型:

from django import models

class Image(models.Model):
    file = models.ImageField(upload_to='uploads/images/')

现在,如果我做image.file.read()我得到AttributeError: 'bytes' object has no attribute 'read'

>>> from images.models import Image
>>> img = Image.objects.first()
>>> img.file.read()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "...\.venv\lib\site-packages\django\core\files\utils.py", line 42, in <lambda>
    read = property(lambda self: self.file.read)
  File "...\.venv\lib\site-packages\django\core\files\utils.py", line 42, in <lambda>
    read = property(lambda self: self.file.read)
AttributeError: 'bytes' object has no attribute 'read'

image.file.file.file返回bytes对象,而不是File对象。我正在使用Django 4.2.1和Python 3.10.7。
下面的代码解决了这个问题,但不是一个可行的解决方法。

import io

from images.models import Image

img = Image.objects.first()
img.file.file.file = io.BytesIO(img.file.file.file)

img.file.read() # Runs without errors

我认为image.file.file.file应该是一个File对象,但它返回的却是一个bytes对象。我是不是漏掉了什么?

uqcuzwp8

uqcuzwp81#

在检查了我的存储库的代码后,我发现错误出在库本身。

from django.core.file import File

import requests

class BunnyStorage(Storage):
    def _open(self, name, mode='rb'): 
        resp = requests.get(self.base_url + name, headers=self.headers)

        if resp.status_code == 404: 
            raise ValueError('File not found.')

        return File(resp.content)

File替换为io.BytesIO(类似文件的对象)后,错误停止。

相关问题