Класс InMemoryStorage

Класс InMemoryStorage представляет собой реализацию файлового хранилища, которое хранит все файлы в оперативной памяти. Это хранилище полезно для тестирования, разработки или ситуаций, где не требуется постоянное хранение файлов на диске. Все файлы, сохраненные через это хранилище, существуют только в течение времени работы процесса и уничтожаются при его завершении.

Синтаксис

pythonfrom django.core.files.storage import InMemoryStorage

storage = InMemoryStorage()

Основные методы

Класс InMemoryStorage наследует все методы базового класса Storage. Рассмотрим основные из них:

python# Сохранение файла
storage.save(name, content)

# Открытие файла
storage.open(name, mode='rb')

# Удаление файла
storage.delete(name)

# Проверка существования файла
storage.exists(name)

# Получение размера файла
storage.size(name)

# Получение списка файлов
storage.listdir(path='')

Пример

Давайте создадим хранилище InMemoryStorage и сохраним в него текстовый файл:

pythonfrom django.core.files.storage import InMemoryStorage
from django.core.files.base import ContentFile

# Создаем экземпляр хранилища
storage = InMemoryStorage()

# Создаем содержимое файла
content = ContentFile(b"Hello, World!")

# Сохраняем файл
saved_name = storage.save("example.txt", content)
print(saved_name)

Результат выполнения кода:

python"example.txt"

Пример

Давайте проверим существование файла, получим его размер и прочитаем содержимое:

pythonfrom django.core.files.storage import InMemoryStorage
from django.core.files.base import ContentFile

storage = InMemoryStorage()

# Сохраняем файл
content = ContentFile(b"Django InMemoryStorage example")
storage.save("test.txt", content)

# Проверяем существование
exists = storage.exists("test.txt")
print(f"File exists: {exists}")

# Получаем размер
size = storage.size("test.txt")
print(f"File size: {size} bytes")

# Читаем файл
with storage.open("test.txt", "rb") as f:
  data = f.read()
  print(f"Content: {data}")

Результат выполнения кода:

python"File exists: True"
"File size: 33 bytes"
"Content: b'Django InMemoryStorage example'"

Пример

Давайте используем InMemoryStorage в модели Django для тестирования:

pythonfrom django.db import models
from django.core.files.storage import InMemoryStorage

# Создаем хранилище для тестов
test_storage = InMemoryStorage()

class Document(models.Model):
  title = models.CharField(max_length=100)
  file = models.FileField(storage=test_storage, upload_to="docs/")

# Создаем экземпляр модели с файлом
from django.core.files.base import ContentFile

doc = Document(title="Test Document")
doc.file.save("report.pdf", ContentFile(b"PDF content here"))
doc.save()

# Проверяем, что файл сохранен
print(doc.file.name)
print(doc.file.size)
print(doc.file.url)

Результат выполнения кода:

python"docs/report.pdf"
17
"/docs/report.pdf"

Пример

Давайте получим список всех файлов в хранилище и удалим один из них:

pythonfrom django.core.files.storage import InMemoryStorage
from django.core.files.base import ContentFile

storage = InMemoryStorage()

# Сохраняем несколько файлов
storage.save("file1.txt", ContentFile(b"Content 1"))
storage.save("file2.txt", ContentFile(b"Content 2"))
storage.save("file3.txt", ContentFile(b"Content 3"))

# Получаем список файлов
files = storage.listdir("")
print(files)

# Удаляем один файл
storage.delete("file2.txt")

# Проверяем оставшиеся файлы
remaining_files = storage.listdir("")
print(remaining_files)

Результат выполнения кода:

python"(['file1.txt', 'file2.txt', 'file3.txt'], [])"
"(['file1.txt', 'file3.txt'], [])"

Особенности использования

Класс InMemoryStorage имеет несколько важных особенностей, которые стоит учитывать при его использовании:

Во-первых, все файлы хранятся в оперативной памяти, поэтому объем хранимых данных ограничен доступной памятью. Во-вторых, файлы не сохраняются между перезапусками приложения - это идеальный вариант для тестирования. В-третьих, хранилище поддерживает все стандартные методы работы с файлами, что делает его удобной заменой для FileSystemStorage в тестовой среде.

Смотрите также

  • класс Storage,
    базовый класс для всех файловых хранилищ
  • класс FileSystemStorage,
    хранилище, которое работает с файловой системой
  • класс ContentFile,
    класс для работы с содержимым файлов в памяти
  • объект default_storage,
    стандартное хранилище по умолчанию в Django