seek() принимает 2 позиционных аргумента, но было задано 3

Я загружаю изображение в память, а затем хочу сохранить его в imageField().

Я использую хранилища django, которые загружают файлы из image/fileField() в AWS S3.

Загружаю образ в память:

        r = requests.get(url, headers=header)
        image = Image.open(BytesIO(r.content))
        image_in_memory = InMemoryUploadedFile(image, None, "foo.png",  'image/png', image.size, None)
        image_in_memory_file = image_in_memory.file

Некоторые проверки:

print(type(image_in_memory))

---
<class 'django.core.files.uploadedfile.InMemoryUploadedFile'>

Когда я сохраняю это:

my_object.cover.save(name="foo.png", content=image_in_memory)

Django генерирует эту ошибку:

web_1      |     link.cover.save(name="foo.png", content=image_in_memory)
web_1      |   File "/usr/local/lib/python3.7/site-packages/django/db/models/fields/files.py", line 87, in save
web_1      |     self.name = self.storage.save(name, content, max_length=self.field.max_length)
web_1      |   File "/usr/local/lib/python3.7/site-packages/django/core/files/storage.py", line 52, in save
web_1      |     return self._save(name, content)
web_1      |   File "/usr/local/lib/python3.7/site-packages/storages/backends/s3boto3.py", line 491, in _save
web_1      |     self._save_content(obj, content, parameters=parameters)
web_1      |   File "/usr/local/lib/python3.7/site-packages/storages/backends/s3boto3.py", line 505, in _save_content
web_1      |     content.seek(0, os.SEEK_SET)
web_1      | TypeError: seek() takes 2 positional arguments but 3 were given

Ты видишь проблему?


person 4m1nh4j1    schedule 09.10.2019    source источник
comment
Может быть, вам следует использовать content=image_in_memory_file?   -  person Barmar    schedule 09.10.2019
comment
Я тоже попробовал и получил ту же ошибку: seek() takes 2 positional arguments but 3 were given   -  person 4m1nh4j1    schedule 09.10.2019


Ответы (1)


По какой-то причине вы оборачиваете файл в класс Pillow Image. Метод Image seek предназначен для последовательностей изображений и, как поясняет ошибка, принимает два позиционных аргумента.

Не обертывайте его как изображение:

r = requests.get(url, headers=header)
image = BytesIO(r.content)
image_in_memory = InMemoryUploadedFile(image, None, "foo.png",  'image/png', len(r.content), None)

Также обратите внимание, что есть более простой класс SimpleUploadedFile, который просто принимает имя и содержимое и, вероятно, вам здесь нужен:

r = requests.get(url, headers=header)
image_in_memory = SimpleUploadedFile("foo.png", r.content, 'image/png')
person Daniel Roseman    schedule 09.10.2019
comment
Есть такая же проблема. Мне нужно обернуть изображение, чтобы изменить его размер. Как сохранить измененное изображение? - person Andrew Fount; 17.11.2020