Сигналы
Список всех сигналов, которые отправляет Django. Все встроенные сигналы отправляются с помощью метода send().
См. также
См. документацию по диспетчеру сигналов для получения информации о том, как регистрировать и получать сигналы.
Фреймворк аутентификации отправляет сигналы при входе/выходе пользователя.
Сигналы моделей
Модуль django.db.models.signals определяет набор сигналов, отправляемых системой моделей.
Предупреждение
Многие из этих сигналов отправляются различными методами моделей, такими как __init__() или save(), которые вы можете переопределить в своём коде.
Если вы переопределяете эти методы в своей модели, вы должны вызвать методы родительского класса, чтобы эти сигналы были отправлены.
Обратите также внимание, что Django по умолчанию хранит обработчики сигналов как слабые ссылки, поэтому, если ваш обработчик является локальной функцией, он может быть удалён сборщиком мусора. Чтобы этого избежать, передайте weak=False при вызове метода connect() сигнала.
Примечание
Сигналы моделей sender модели могут быть лениво ссылаться при подключении получателя, указав полное имя приложения. Например, модель Answer , определённая в приложении polls, может быть указана как 'polls.Answer'. Такая ссылка может быть очень удобной при работе с циклическими зависимостями импорта и взаимозаменяемыми моделями.
pre_init
-
django.db.models.signals.pre_init
Всякий раз, когда вы инициализируете модель Django, этот сигнал отправляется в начале метода __init__() модели.
Передаваемые аргументы:
-
sender - Класс модели, у которой только что был создан экземпляр.
-
args - Список позиционных аргументов, переданных в
__init__(). -
kwargs - Словарь ключевых аргументов, переданных в
__init__().
Например, в учебнике есть такая строка:
p = Poll(question="What's up?", pub_date=datetime.now())
Аргументы, отправленные обработчику pre_init, будут следующими:
| Аргумент | Значение |
|---|---|
sender |
Poll (сам класс) |
args |
[] (пустой список, потому что позиционные аргументы не передавались в __init__().) |
kwargs | {'question': "What's up?", 'pub_date': datetime.now()} |
post_init
-
django.db.models.signals.post_init
Как и pre_init, но этот сигнал отправляется, когда метод __init__() завершает свою работу.
Передаваемые аргументы:
-
sender - Как выше: класс модели, у которой только что был создан экземпляр.
-
instance - Фактический экземпляр модели, который только что был создан.
pre_save
-
django.db.models.signals.pre_save
Отправляется в начале метода save() модели.
Передаваемые аргументы:
-
sender - Класс модели.
-
instance - Фактический сохраняемый экземпляр.
-
raw - Булево значение;
Trueесли модель сохраняется точно как представлено (например, при загрузке фикстуры). Не следует выполнять запросы/модификации других записей в базе данных, так как база данных может ещё не быть в согласованном состоянии. -
using - Используемый псевдоним базы данных.
-
update_fields - Набор полей для обновления, переданных методу
Model.save(), илиNoneеслиupdate_fieldsне было передано вsave().
post_save
-
django.db.models.signals.post_save
Как pre_save, но отправляется в конце метода save().
Передаваемые аргументы:
-
sender - Класс модели.
-
instance - Фактический экземпляр, который сохраняется.
-
created - Булево значение;
Trueесли была создана новая запись. -
raw - Булево значение;
Trueесли модель сохраняется точно как представлено (например, при загрузке фикстуры). Не следует выполнять запросы/модификации других записей в базе данных, так как база данных может ещё не быть в согласованном состоянии. -
using - Используемый псевдоним базы данных.
-
update_fields - Набор полей для обновления, переданных в
Model.save(), илиNoneеслиupdate_fieldsне было передано вsave().
pre_delete
-
django.db.models.signals.pre_delete
Отправляется в начале метода delete() модели и метода delete() набора запросов.
Передаваемые аргументы:
-
sender - Класс модели.
-
instance - Фактический удаляемый экземпляр.
-
using - Используемый псевдоним базы данных.
post_delete
-
django.db.models.signals.post_delete
Как pre_delete, но отправляется в конце метода delete() модели и метода delete() набора запросов.
Передаваемые аргументы:
-
sender - Класс модели.
-
instance -
Фaктический удаляемый экземпляр.
Обратите внимание, что объект больше не будет находиться в базе данных, поэтому будьте очень осторожны с этим экземпляром.
-
using - Используемый псевдоним базы данных.
m2m_changed
-
django.db.models.signals.m2m_changed
Отправляется при изменении ManyToManyField в экземпляре модели. Строго говоря, это не сигнал модели, так как он отправляется полем ManyToManyField, но так как он дополняет pre_save/post_save и pre_delete/post_delete в отслеживании изменений в моделях, он включён здесь.
Передаваемые аргументы:
-
sender - Класс промежуточной модели, описывающий
ManyToManyField. Этот класс автоматически создаётся при определении поля «многие ко многим»; к нему можно получить доступ через атрибутthroughполя «многие ко многим». -
instance - Экземпляр, чья связь «многие ко многим» обновляется. Это может быть экземпляр
sender, или экземпляр класса, к которому относитсяManyToManyField. -
action -
Строка, указывающая тип обновления связи. Может принимать одно из следующих значений:
-
"pre_add" - Отправляется до добавления одного или нескольких объектов в связь.
-
"post_add" - Отправляется после добавления одного или нескольких объектов в связь.
-
"pre_remove" - Отправляется до удаления одного или нескольких объектов из связи.
-
"post_remove" - Отправляется после удаления одного или нескольких объектов из связи.
-
"pre_clear" - Отправляется до очистки связи.
-
"post_clear" - Отправляется после очистки связи.
-
-
reverse - Указывает, какая сторона связи обновляется (т.е., прямая или обратная связь модифицируется).
-
model - Класс объектов, которые добавляются в, удаляются из или очищаются из связи.
-
pk_set -
Для действий
pre_add,post_add,pre_removeиpost_remove, это множество значений первичных ключей, которые были добавлены в или удалены из связи.Для действий
pre_clearиpost_clear, этоNone. -
using - Используемый псевдоним базы данных.
Например, если Pizza может иметь несколько объектов Topping, смоделированных так:
class Topping(models.Model):
# ...
pass
class Pizza(models.Model):
# ...
toppings = models.ManyToManyField(Topping)
Если мы подключили обработчик так:
from django.db.models.signals import m2m_changed
def toppings_changed(sender, **kwargs):
# Do something
pass
m2m_changed.connect(toppings_changed, sender=Pizza.toppings.through)
и затем сделали что-то вроде этого:
>>> p = Pizza.objects.create(...) >>> t = Topping.objects.create(...) >>> p.toppings.add(t)
аргументы, отправленные в обработчик m2m_changed (toppings_changed в примере выше), будут:
| Аргумент | Значение |
|---|---|
sender |
Pizza.toppings.through (класс промежуточной модели «многие ко многим») |
instance |
p (экземпляр Pizza объекта, который изменяется) |
action |
"pre_add" (за ним следует отдельный сигнал с "post_add") |
reverse |
False (Pizza содержит ManyToManyField, поэтому этот вызов изменяет прямую связь) |
model |
Topping (класс объектов, добавленных в Pizza) |
pk_set |
{t.id} (поскольку только Topping t был добавлен в связь) |
using |
"default" (поскольку стандартный маршрутизатор отправляет записи сюда) |
И если затем мы сделаем что-то вроде этого:
>>> t.pizza_set.remove(p)
аргументы, отправленные в обработчик m2m_changed, будут:
| Аргумент | Значение |
|---|---|
sender |
Pizza.toppings.through (класс промежуточной модели «многие ко многим») |
instance |
t (экземпляр Topping объекта, который изменяется) |
action |
"pre_remove" (за ним следует отдельный сигнал с "post_remove") |
reverse |
True (Pizza содержит ManyToManyField, поэтому этот вызов изменяет обратную связь) |
model |
Pizza (класс объектов, удалённых из Topping) |
pk_set |
{p.id} (поскольку только Pizza p был удалён из связи) |
using |
"default" (поскольку стандартный маршрутизатор отправляет записи сюда) |
class_prepared
-
django.db.models.signals.class_prepared
Отправляется всякий раз, когда класс модели был «подготовлен» — то есть, после того, как модель была определена и зарегистрирована в системе моделей Django. Django использует этот сигнал внутри; он обычно не используется в сторонних приложениях.
Поскольку этот сигнал отправляется во время процесса заполнения реестра приложений, и AppConfig.ready() выполняется после полного заполнения реестра приложений, получатели не могут быть подключены в этом методе. Одним из вариантов является подключение их AppConfig.__init__() вместо, позаботившись о том, чтобы не импортировать модели или не вызывать вызовы реестра приложений.
Аргументы, которые отправляются с этим сигналом:
-
sender - Класс модели, который только что был подготовлен.
Сигналы управления
Сигналы, отправляемые командой django-admin.
pre_migrate
-
django.db.models.signals.pre_migrate
Отправляется командой migrate перед началом установки приложения. Он не отправляется для приложений, у которых отсутствует модуль models.
Аргументы, отправляемые с этим сигналом:
-
sender - Экземпляр
AppConfigдля приложения, которое собирается мигрировать/синхронизировать. -
app_config - То же, что и
sender. -
verbosity -
Указывает, сколько информации manage.py выводит на экран. Подробности см. в флаге
--verbosity.Функции, которые слушают сигнал
pre_migrate, должны корректировать то, что они выводят на экран, в зависимости от значения этого аргумента. -
interactive -
Если
interactiveравноTrue, можно безопасно попросить пользователя ввести данные с помощью командной строки. ЕслиinteractiveравноFalse, функции, которые слушают этот сигнал, не должны пытаться запрашивать что-либо.Например, приложение
django.contrib.authзапрашивает создание суперпользователя только в том случае, еслиinteractiveравноTrue. -
using - Псевдоним базы данных, на которой будет работать команда.
post_migrate
-
django.db.models.signals.post_migrate
Отправляется командой migrate после установки приложения и командой flush. Не отправляется для приложений, у которых отсутствует модуль models.
Важно, чтобы обработчики этого сигнала выполняли идемпотентные изменения (например, без изменений в базе данных), так как это может привести к сбою команды управления flush, если она также была запущена во время команды migrate.
Аргументы, отправляемые с этим сигналом:
-
sender - Объект
AppConfigприложения, которое только что было установлено. -
app_config - То же, что и
sender. -
verbosity -
Указывает, сколько информации выводит manage.py на экран. Подробнее см. флаг
--verbosity.Функции, которые прослушивают
post_migrate, должны корректировать вывод на экран в зависимости от значения этого аргумента. -
interactive -
Если
interactiveравноTrue, можно безопасно попросить пользователя ввести данные в командной строке. ЕслиinteractiveравноFalse, функции, которые прослушивают этот сигнал, не должны пытаться запросить какие-либо данные.Например, приложение
django.contrib.authзапрашивает создание суперпользователя только тогда, когдаinteractiveравноTrue. -
using - Псевдоним базы данных, используемый для синхронизации. По умолчанию используется база данных
default.
Например, вы можете зарегистрировать обработчик в AppConfig так:
from django.apps import AppConfig
from django.db.models.signals import post_migrate
def my_callback(sender, **kwargs):
# Your specific logic here
pass
class MyAppConfig(AppConfig):
...
def ready(self):
post_migrate.connect(my_callback, sender=self)
Примечание
Если вы передаете объект AppConfig в качестве аргумента отправителя, убедитесь, что сигнал зарегистрирован в ready(). Объекты AppConfig создаются заново для тестов, которые выполняются с изменённым набором INSTALLED_APPS (например, при переопределении настроек), и такие сигналы должны быть подключены для каждого нового экземпляра AppConfig.
Сигналы запроса/ответа
Сигналы, отправляемые ядром фреймворка при обработке запроса.
request_started
-
django.core.signals.request_started
Отправляется, когда Django начинает обработку HTTP-запроса.
Аргументы, отправляемые с этим сигналом:
-
sender - Класс обработчика — например,
django.core.handlers.wsgi.WsgiHandler— который обработал запрос. -
environ - Словарь
environ, предоставленный запросу.
Аргумент environ был добавлен.
request_finished
-
django.core.signals.request_finished
Отправляется, когда Django завершает предоставление HTTP-ответа клиенту.
Примечание
Некоторые WSGI-серверы и промежуточное ПО не всегда вызывают close на объекте ответа после обработки запроса, в частности uWSGI до версии 1.2.6 и промежуточное ПО отчетов об ошибках Sentry до версии 2.0.7. В таких случаях этот сигнал вообще не отправляется. Это может привести к неиспользуемым соединениям с базами данных и серверами memcache.
Аргументы, отправляемые с этим сигналом:
-
sender - Класс обработчика, как указано выше.
got_request_exception
-
django.core.signals.got_request_exception
Этот сигнал отправляется всякий раз, когда Django сталкивается с исключением при обработке входящего HTTP-запроса.
Аргументы, отправляемые с этим сигналом:
-
sender - Класс обработчика, как указано выше.
-
request - Объект
HttpRequest.
Сигналы тестов
Сигналы, которые отправляются только при запуске тестов.
setting_changed
-
django.test.signals.setting_changed
Этот сигнал отправляется при изменении значения настройки с помощью менеджера контекста django.test.TestCase.settings() или декоратора/менеджера контекста django.test.override_settings().
Он фактически отправляется дважды: при применении нового значения («настройка») и при восстановлении исходного значения («разрушение»). Используйте аргумент enter для различения этих двух случаев.
Вы также можете импортировать этот сигнал из django.core.signals, чтобы избежать импорта из django.test в ситуациях, не связанных с тестами.
Сигнал был перемещён в django.core.signals как описано выше.
Аргументы, отправляемые с этим сигналом:
-
sender - Обработчик настроек.
-
setting - Имя настройки.
-
value - Значение настройки после изменения. Для настроек, которые изначально не существуют, в фазе «разрушения»
valueравноNone. -
enter - Булево значение;
Trueесли настройка применена,Falseесли восстановлена.
template_rendered
-
django.test.signals.template_rendered
Отправляется, когда система тестов отображает шаблон. Этот сигнал не испускается во время нормальной работы сервера Django — он доступен только во время тестирования.
Аргументы, отправляемые с этим сигналом:
-
sender - Объект
Template, который был отображен. -
template - То же, что и отправитель
-
context - Объект
Context, с помощью которого был отображен шаблон.
Обёртки баз данных
Сигналы, отправляемые обёрткой базы данных, когда создаётся подключение к базе данных.
connection_created
-
django.db.backends.signals.connection_created
Отправляется, когда обёртка базы данных устанавливает первоначальное соединение с базой данных. Это особенно полезно, если вы хотите отправить команды после подключения к SQL-бекенду.
Аргументы, отправляемые с этим сигналом:
-
sender - Класс обёртки базы данных — например,
django.db.backends.postgresql.DatabaseWrapperилиdjango.db.backends.mysql.DatabaseWrapper, и т.д. -
connection - Подключение к базе данных, которое было открыто. Это может быть использовано в конфигурации с несколькими базами данных, чтобы различать сигналы соединения от разных баз данных.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/1.9/ref/signals/