Уведомления

Группа в Telegram: @pythonsu

#1 Март 2, 2013 10:56:40

likin
От:
Зарегистрирован: 2010-03-15
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

Доброго дня.

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

Спасибо.



Офлайн

#2 Март 2, 2013 14:45:05

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

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

Скажу про свой опыт. Когда их делал, делал по примеру. Сигналы все регистрировал в models.py , там они работают, как положено. Когда же захотел вынести их в отдельный файл, то же в signals.py, то работать перестали. Я сделал вывод, что жить им нужно только в models.py =) Делал кстати, расширение обычной модели auth.models.User, сигналами: после_сохранения, перед_удалением редактировал соответствующую модель профиля my_app.models.UserProfile

Отредактировано buddha (Март 2, 2013 14:47:31)

Офлайн

#3 Март 2, 2013 15:00:44

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

Говорится про место.
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. Но только предположу.
Тут телепат один есть, может он заскочит в топик, поможет уточнить вопрос.

Отредактировано nnmware (Март 2, 2013 15:11:28)

Офлайн

#4 Март 2, 2013 15:19:58

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

Размыто объяснено. Нет конкретики. Весь вопрос то и заключается в том, как зарегистрировать перед тем, как сигнал будет послан?

Офлайн

#5 Март 2, 2013 15:54:39

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

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


Отредактировано nnmware (Март 2, 2013 16:06:58)

Офлайн

#6 Март 2, 2013 16:02:41

buddha
От:
Зарегистрирован: 2012-03-02
Сообщения: 422
Репутация: +  15  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

Отлично, спасибо!

Офлайн

#7 Март 2, 2013 16:19:03

likin
От:
Зарегистрирован: 2010-03-15
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

Спасибо.



Офлайн

#8 Март 2, 2013 16:27:44

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

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

Офлайн

#9 Март 3, 2013 09:03:52

likin
От:
Зарегистрирован: 2010-03-15
Сообщения: 114
Репутация: +  1  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

Доброго утра.

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

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

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

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

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

Так получается в моей ситуации.



Офлайн

#10 Март 3, 2013 09:21:39

nnmware
Зарегистрирован: 2012-07-21
Сообщения: 133
Репутация: +  13  -
Профиль   Отправить e-mail  

Как и где правильно подключать signals

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

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version