При использовании хранилища по умолчанию 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()
эквивалента.
Итак, мои вопросы следующие:
- Should a file opened with Django's Default Storage be closed?
- If so, how?
- 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()