При использовании хранилища по умолчанию 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()