Django MD5Storage - если много файлов в одном каталоге

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