Действие Django после загрузки файла

У нас есть обширная существующая кодовая база, и мы добавили к уравнению серверы с балансировкой нагрузки с одним главным сервером. Существуют различные приложения, которые содержат модели с загруженными файлами и изображениями, и все они работают нормально... Однако это вызывает очевидную проблему задержки rsync. Rsync находится в crontab и настроен на запуск каждую минуту, но это по-прежнему означает, что существует потенциальное 59-секундное ожидание между созданием контента и его фактическим существованием на веб-серверах.

Что бы я хотел, так это иметь возможность зарегистрировать какой-то обработчик «сообщения об изменении файла», который запускает rsync всякий раз, когда загружается новый файл. Но я не могу найти ничего подобного! В Django есть обработчики загрузки файлов, но они, по-видимому, имеют дело только с фактическим потоком загрузки, а не с файлом, который после этого сохраняется в файловой системе.

Лучшим подходом, который я вижу, является создание простых расширений для FileField, FieldFile, ImageField и ImageFieldFile как части моего проекта и подключение к методам сохранения и удаления в FileField. По сути, для создания настраиваемых полей «Файл» и «Изображение» с добавлением этого поведения. Это не очень сложно сделать, но мне это не кажется самым элегантным решением. Мне нужно будет рассказать Югу о моих новых полях, обновить каждую затронутую модель, а затем создать множество южных миграций (которые, я почти уверен, будут конфликтовать с некоторым кодом, который у нас есть на рассмотрении).

Я также рассматриваю возможность создания собственного класса Storage для проекта, но меня беспокоит, что это может иметь далеко идущие последствия для других фрагментов кода.

Я не могу поверить, что никто не сталкивался с этой проблемой раньше, есть ли канонический подход?

Большое спасибо!


person adamnfish    schedule 12.11.2010    source источник


Ответы (1)


Если вы хотите решить эту проблему на стороне сервера (например, аналогичное решение для rsync) и используете Linux, вы можете проверить lsyncd:

http://code.google.com/p/lsyncd/

lsyncd использует inotify в ядре Linux для просмотра каталогов и запуска rsync сразу после изменения файлов. Достаточно просто зайти.

person dansimau    schedule 12.11.2010
comment
Большое спасибо. Способ мыслить нестандартно ;) Я рассмотрю это на следующей неделе и дам вам знать, как все идет. С главной страницы... Lsyncd vs. cron: If you find a solution using cron to call rsync over the whole directory tree periodically after every 'X' hours/minutes/seconds more satisfying than lsyncd, please go for it ''sulking''. We don't like it! - person adamnfish; 12.11.2010