Найти - Пользователи
Полная версия: Как и где правильно подключать signals
Начало » Django » Как и где правильно подключать signals
1 2
likin
Доброго дня.

Подскажите.
Как и где правильно подключать signals?
Все сигналы у меня лежат в signals.py. Автоматически они не подсоединяются. Я добавил подсоединение в app/__init__.py
Но заметил, что они подсоединяются один раз при активайии сервера(локального).

Спасибо.
buddha
Щас читалнул про сигналы https://docs.djangoproject.com/en/1.5/topics/signals/. Не нашел, чтобы там говорилось про место расположения.

Скажу про свой опыт. Когда их делал, делал по примеру. Сигналы все регистрировал в models.py , там они работают, как положено. Когда же захотел вынести их в отдельный файл, то же в signals.py, то работать перестали. Я сделал вывод, что жить им нужно только в models.py =) Делал кстати, расширение обычной модели auth.models.User, сигналами: после_сохранения, перед_удалением редактировал соответствующую модель профиля my_app.models.UserProfile
nnmware
Говорится про место.
https://docs.djangoproject.com/en/dev/topics/signals/#connecting-receiver-functions (чуть пониже)
Where should this code live?
You can put signal handling and registration code anywhere you like. However, you’ll need to make sure that the module it’s in gets imported early on so that the signal handling gets registered before any signals need to be sent. This makes your app’s models.py a good place to put registration of signal handlers.
Смысл- кладите куда угодно, но убедитесь что регистрируются перед тем как любой сигнал будет послан, поэтому models.py самое то.
Хороший вопрос кстати почему в __init__.py такая штука получается.
Сам не знаю, предположу что если класть туда - система сигналов будет работать некорректно, ибо в таком случае сигнал импортировался до импорта модели, а джанга создаст необходимые внутренние структуры, к которым можно подключаться, только прочитав models.py. Но только предположу.
Тут телепат один есть, может он заскочит в топик, поможет уточнить вопрос.

buddha
Размыто объяснено. Нет конкретики. Весь вопрос то и заключается в том, как зарегистрировать перед тем, как сигнал будет послан?
nnmware
Ну регистрируется ведь при импорте, так?
Написано ведь- убедитесь что этот блок импортируется перед тем как сигнал будет послан.
Свои фирменные сигналы можно импортировать например во вьюхах которых их посылают.
А в случае классических pre_save и тп- действительно только в models.py им и место.


buddha
Отлично, спасибо!
likin
Спасибо.
nnmware
Да было б за что.
Я Вас отлично понимаю, сам в свое время долго разбирался пока django-way чучуть не начал понимать.
Очень логично все сделано.
А вот насчет версии про __init__.py ждем подтверждения или опровержения более знающих людей.
likin
Доброго утра.

Подключил сигналы в одном из MiddleWare - работает.
В моделях у меня не рабоатет также. Я выяснил(подтвердил) порядок загрузки.

module/__init__.py
активируется только при явном импорте модуля
import module

То есть если я сделаю
import module.submodule
model.__init__.py не отработает.

Похожая ситуация и с model.py
Если я импортирую модель
from model import Info
model.py - не запукает код, только делает импорт.

Для того, что-бы отработал код в модели нужно сделать
import app.model

Так получается в моей ситуации.
nnmware
likin
Похожая ситуация и с model.py
Если я импортирую модель
from model import Info
model.py - не запукает код, только делает импорт.
Вот тут то и порылась собака.
а) Джанго полностью импортирует models.py которые прописаны в приложениях, соответственно тогда сигналы подключатся.
б) from model import Info - конечно не запустит. Вы же не сигнал импортируете в данном случае, а модель. а вот from model import * - запустит при правильных условиях
в) что-то путано у Вас, не models.py как надо, а model.py. См.пункт а) имя исправьте и все должно стать красиво.
В MiddleWare не думаю что грамотно подключать, разберитесь обязательно по правильному как рекомендуют сами разработчики через models.py
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB