При использовании хранилища по умолчанию Django нужно/можно закрывать() открытый файл?

При использовании DefaultStorage Django можно открыть и прочитать файл примерно так:

from django.core.files.storage import default_storage

file = default_storage.open("dir/file.txt", mode="rb")
data = file.read()

При использовании собственного метода python open(), лучше всего close() файл после этого, или использовать with open("dir/file.txt") as file: конструкцию.

Но читая документацию по классам хранения Django, и просматривая исходники, я не вижу close() эквивалента.

Итак, мои вопросы следующие:

  1. Should a file opened with Django's Default Storage be closed?
  2. If so, how?
  3. If not, why isn't it necessary?

Вы не видите метода close, потому что смотрите на класс Storage. Метод open класса Storage возвращает экземпляр django.core.files.base.File [Исходный код], который в основном оборачивает объект файла python и также имеет метод close, который закрывает файл (Методы, такие как read и т.д. наследуются от FileProxyMixin).

Обычно, когда вы открываете файл, вы должны закрыть его, то же самое происходит и с Django, что также подчеркивается в документации:

Закрытие файлов особенно важно при обращении к полям файла в цикле по большому количеству объектов. Если файлы не закрываются вручную после обращения к ним, может возникнуть риск исчерпания файловых дескрипторов возникнуть. Это может привести к следующей ошибке:

OSError: [Errno 24] Too many open files

Но есть несколько случаев, когда вы не должны закрывать файлы, в основном это когда вы передаете файл какой-либо функции / методу / объекту, который будет его читать, например, если вы создаете FileResponse объект , вы не должны закрывать файл, так как Django закроет его сам:

Файл будет закрыт автоматически, поэтому не открывайте его с помощью контекстного менеджером.

Чтобы завершить код примера, вы закроете файл следующим образом:

from django.core.files.storage import default_storage

file = default_storage.open("dir/file.txt", mode="rb")
data = file.read()
file.close()
Вернуться на верх