seek () принимает 2 позиционных аргумента, но 3 было дано - PullRequest
0 голосов
/ 09 октября 2019

Я загружаю изображение в память, затем хочу сохранить его в 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

Вы видите проблему?

1 Ответ

0 голосов
/ 09 октября 2019

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

Не переносите его как Image:

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')
...