Сигналы
Список всех сигналов, которые отправляет Django. Все встроенные сигналы отправляются с помощью метода send().
См. также
См. документацию по диспетчеру сигналов для получения информации о том, как регистрироваться на сигналы и получать их.
Фреймворк аутентификации отправляет сигналы при входе/выходе пользователя.
Сигналы моделей
Модуль django.db.models.signals определяет набор сигналов, отправляемых системой моделей.
Предупреждение
Многие из этих сигналов отправляются различными методами модели, такими как __init__() или save(), которые вы можете переопределить в собственном коде.
Если вы переопределяете эти методы в своей модели, вы должны вызвать методы родительского класса, чтобы эти сигналы были отправлены.
Обратите также внимание, что Django по умолчанию сохраняет обработчики сигналов как слабые ссылки, поэтому, если ваш обработчик — локальная функция, он может быть удалён сборщиком мусора. Чтобы предотвратить это, передайте weak=False при вызове метода connect() сигнала.
Примечание
Сигналы моделей sender модели могут быть лениво обработаны при подключении приемника, указав полное имя приложения. Например, модель Question из приложения polls может быть указана как 'polls.Question'. Такой тип ссылки может быть очень удобен при работе с циклическими зависимостями импорта и взаимозаменяемыми моделями.
pre_init
-
django.db.models.signals.pre_init
Всякий раз, когда вы создаёте экземпляр Django модели, этот сигнал отправляется в начале метода __init__() модели.
Аргументы, отправленные с этим сигналом:
-
sender - Класс модели, для которой только что был создан экземпляр.
-
args - Список позиционных аргументов, переданных в
__init__(). -
kwargs - Словарь ключевых аргументов, переданных в
__init__().
Например, в учебнике есть такая строка:
q = Question(question_text="What's new?", pub_date=timezone.now())
Аргументы, отправленные обработчику pre_init, будут такими:
| Аргумент | Значение |
|---|---|
sender |
Question (сам класс) |
args |
[] (пустой список, так как позиционные аргументы не передавались в __init__() ) |
kwargs |
{'question_text': "What's new?", 'pub_date': datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)}
|
post_init
-
django.db.models.signals.post_init
Как pre_init, но этот сигнал отправляется после завершения метода __init__().
Аргументы, отправленные с этим сигналом:
-
sender - Как выше: класс модели, для которой только что был создан экземпляр.
-
instance -
Фактический экземпляр модели, который только что был создан.
Примечание
instance._stateне задаётся перед отправкой сигналаpost_init, поэтому атрибуты_stateвсегда имеют свои значения по умолчанию. Например,_state.dbимеет значениеNone.
Предупреждение
По соображениям производительности не следует выполнять запросы в приемниках сигналов pre_init или post_init, так как они будут выполняться для каждого экземпляра, возвращаемого при итерации набора результатов запроса.
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 -
Фактический удаляемый экземпляр.
Обратите внимание, что объект больше не будет находиться в базе данных, поэтому будьте очень осторожны, что вы делаете с этим экземпляром.
-
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это набор значений первичного ключа, которые будут или уже были добавлены в связь. Это может быть подмножество значений, предоставленных для добавления, так как вставки должны фильтровать существующие значения, чтобы избежатьIntegrityErrorбазы данных.Для действий
pre_removeиpost_removeэто набор значений первичного ключа, которые были предоставлены для удаления из связи. Это не зависит от того, будут ли значения фактически удалены или уже удалены. В частности, могут быть предоставлены несуществующие значения, и они появятся вpk_set, даже если они не оказывают влияния на базу данных.Для действий
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 (промежуточный класс m2m) |
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 (промежуточный класс m2m) |
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. -
stdout -
Добавлено в Django 4.0.
Потокоподобный объект, в который должен быть перенаправлен подробный вывод.
-
using - Псевдоним базы данных, на которой будет работать команда.
-
plan - План миграции, который будет использоваться для выполнения миграции. Хотя план не является общедоступным API, это позволяет для редких случаев, когда необходимо знать план. План представляет собой список пар вида (тип миграции, статус - rollback или apply).
-
apps - Экземпляр
Apps, содержащий состояние проекта до выполнения миграции. Его следует использовать вместо глобального реестраapps, чтобы получить модели, на которых вы хотите выполнить операции.
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. -
stdout -
Новое в Django 4.0.
Потокоподобный объект, в который должен быть перенаправлен подробный вывод.
-
using - Псевдоним базы данных, используемый для синхронизации. По умолчанию используется база данных
default. -
plan - План миграций, который был использован для выполнения миграции. Хотя план не является частью публичного API, это позволяет в редких случаях узнать о плане. План представляет собой список пар кортежей, где первый элемент — экземпляр класса миграции, а второй — показывает, была ли миграция отменена (
True) или применена (False). -
apps - Экземпляр
Apps, содержащий состояние проекта после выполнения миграции. Его следует использовать вместо глобальной регистрацииappsдля получения моделей, на которых нужно выполнять операции.
Например, вы можете зарегистрировать обратный вызов в 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(). Экземпляры пересоздаются для тестов, которые выполняются с изменённым набором INSTALLED_APPS (например, при переопределении настроек), и такие сигналы должны быть подключены для каждого нового экземпляра AppConfig.
Сигналы запроса/ответа
Сигналы, отправляемые ядром фреймворка при обработке запроса.
request_started
-
django.core.signals.request_started
Отправляется, когда Django начинает обрабатывать HTTP-запрос.
Аргументы, отправляемые с этим сигналом:
-
sender - Класс обработчика — например,
django.core.handlers.wsgi.WsgiHandler— который обрабатывал запрос. -
environ - Словарь
environ, предоставленный для запроса.
request_finished
-
django.core.signals.request_finished
Отправляется, когда Django завершает доставку HTTP-ответа клиенту.
Аргументы, отправляемые с этим сигналом:
-
sender - Класс обработчика, как выше.
got_request_exception
-
django.core.signals.got_request_exception
Этот сигнал отправляется всякий раз, когда Django сталкивается с исключением при обработке входящего HTTP-запроса.
Аргументы, отправляемые с этим сигналом:
-
sender - Не используется (всегда
None). -
request - Объект
HttpRequest.
Сигналы тестов
Сигналы, отправляемые только при запуске тестов.
setting_changed
-
django.test.signals.setting_changed
Этот сигнал отправляется, когда значение настройки меняется через менеджер контекста django.test.TestCase.settings() или декоратор/менеджер контекста django.test.override_settings().
Он фактически отправляется дважды: когда новое значение применяется («setup») и когда восстанавливается исходное значение («teardown»). Используйте аргумент enter для различения этих двух случаев.
Вы также можете импортировать этот сигнал из django.core.signals для избежания импорта из django.test в ситуациях, не связанных с тестами.
Аргументы, отправляемые с этим сигналом:
-
sender - Обработчик настроек.
-
setting - Имя настройки.
-
value - Значение настройки после изменения. Для настроек, которые первоначально не существуют, на фазе «teardown»
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/4.0/ref/signals/