Blog Entry: Django MD5Storage - если много файлов в одном каталоге
В наших крупных проектах часто встречается ситуация, когда к какой нибудь модели привязываются файлы, вероятность перечечения имен которых велика. Django в этом случае добавляет _ к имени, но это конечный вариант и проблематичен для публичных интерфейсов. Да и даже для внутренних и то не очень хорошо когда каждый раз при update документа у нас добавляется _.
Но остновное - конечно проблемы со скоростью доступа к файлам. Если в каталоге лежат тычячи а то и десятки тысяч файлов - скорость работы с таким каталогом падает, особенно если файловая система не заточена под подобное использование. А эта ситация, которая возникает сплошь и рядом - для примера, аватары пользователей, или картинки продуктов на сайте e-commerce. Свалить всё это в один каталог - не очень хорошая идея.
Простое решение сразу пришло в голову как я увидел описание Writing a custom storage system на сайте документации Django. Не долго думая, реализовал совместно с Vic django app, и поместил его в свободный доступ.
Ещй раз плюсы подобного подхода:
- Легко осилит хранение сотен тысяч файлов в каталоге с подкаталогами на файловой системе
- Очень просто инсталлируется - 2 строки в описании модели
- Файлы с одинаковым содержимым храняться один раз
- Множественные аплоады одного файла не приводят к проблемам с именем файла.
Инсталлировать:
В корневой папке своего проекта развернуть все hdg утилиты:
svn co http://svn.halogen-dg.com/svn/repos/hdg/trunk -r HEAD hdg
В модели:
from hdg.djangoapps.MD5Storage.storage import MD5Storage
class SomeModel(models.Model):
some_picture = models.ImageField(storage=MD5Storage(),
upload_to='pictures')
Получиться примерно следующее:
- htdocs
- pictures
- 0a
- 0b
- 0c
- ...
- pictures
