NamedTemporaryFile срабатывает SuspiciousFileOperation
В django версии 3.2.12 я пытаюсь загрузить изображение, для которого у меня есть URL, и сохранить его в поле ImageField. Это выглядит следующим образом:
def load_image_from_url(self):
image_file = NamedTemporaryFile(delete=True, dir='project/media')
with urlopen(self.extra_large_url) as uo:
assert uo.status == 200
image_file.write(uo.read())
image_file.flush()
image = File(image_file)
self.image.save(image.name, image)
Когда я создаю NamedTemporaryFile, создаваемый путь является абсолютным путем.
В django.core.files.utils он блокируется при следующем условии:
if allow_relative_path:
# Use PurePosixPath() because this branch is checked only in
# FileField.generate_filename() where all file paths are expected to be
# Unix style (with forward slashes).
path = pathlib.PurePosixPath(name)
if path.is_absolute() or '..' in path.parts:
raise SuspiciousFileOperation(
"Detected path traversal attempt in '%s'" % name
)
При задании аргумента dir для NamedTemporaryFile проблема сохраняется, даже если папка является подкаталогом проекта.
Есть ли лучшее решение, чем делать это:
self.image.save(os.path.basename(image.name), image)