Джанго: Для чего нужны сигналы? - PullRequest
7 голосов
/ 20 января 2010

Мне сложно понять, как сигналы работают в моем приложении (и как они работают). Это три области, где я предполагаю, что они будут применяться (с моими текущими знаниями):

  1. Отправка XML на удаленный сервер для создания отчетов (после завершения транзакции).
  2. Измените размер изображения и загрузите миниатюру на S3 после того, как пользователь ее загрузит.
  3. Удаление старых изображений из S3 после того, как пользователь удаляет объект изображения из своей учетной записи.

Неужели я полностью вне базы (я чувствую, что могу быть). Получаю ли я смешанные сигналы и многопоточность ? Если так, они сравнивают там в приложении? Они только для развязки? Кроме того, в чем заключается гарантия того, что вы создадите их на ранней стадии и не будете использовать локальную функцию (поскольку они будут собирать мусор)? Кто-нибудь может уточнить это? Должен ли я поместить их все в запрос Middleware, чтобы мне не пришлось беспокоиться?

Ответы [ 3 ]

16 голосов
/ 20 января 2010

Сигналы Django - это способ выполнить действие A в ответ на событие E.

В нереальном мире вы можете избежать использования сигналов, изменив код, в котором происходит событие E, и добавив код для выполнения действия A.

Проблема в том, что при этом вы теряете удобство обслуживания, удобочитаемость и множество других прилагательных для разработки программного обеспечения:)

Сигналы позволяют вам делать то же самое независимо от того, где и как происходит событие E, и таким образом делают это умным способом, обеспечивающим удобство обслуживания, читаемость и т. Д. *

Да, я думаю, что утверждение о том, что сигналы полезны для включения развязки , действительно верно.

(Вы также упомянули многопоточность. Если вы это сделали, потому что считаете, что сигналы хороши, потому что они выполняются одновременно и так быстро ... Ну ... Я не знаю, выполняются ли они одновременно, но в любом случае я действительно не понимаю не думаю, что это именно то, для чего полезны сигналы джанго)

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

4 голосов
/ 20 января 2010

Вот пример, который может помочь.

Предположим, вам нужно выполнить какое-то действие при сохранении экземпляра модели.Однако это действие не имеет ничего общего с моделью или самим экземпляром модели напрямую.Поэтому нет смысла помещать код вашего действия в метод save () модели.Это приведет к ненужной связи кода и беспорядку.Вместо этого вы можете создать обработчик сигнала где-то еще в вашем приложении (или даже в другом приложении), где это имеет больше смысла.

1 голос
/ 06 октября 2011

Я бы выполнил Задачи 2 и 3 (с изображениями) с чем-то вроде асинхронной очереди задач, например Celery

Это похоже на многопоточность.

...