Сигналы
Список всех сигналов, отправляемых 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=datetime.timezone.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 - Используемый псевдоним базы данных.
origin
Model или QuerySet. post_delete
-
django.db.models.signals.post_delete
Подобно pre_delete, но отправляется в конце метода delete() модели и метода delete() набора результатов запроса.
Аргументы, отправляемые с этим сигналом:
-
sender - Класс модели.
-
instance -
Фактический удаляемый экземпляр.
Обратите внимание, что объект больше не будет находиться в базе данных, поэтому будьте осторожны с тем, что вы делаете с этим экземпляром.
-
using - Используемый псевдоним базы данных.
origin
Model или QuerySet. 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 - Объект потокового типа, куда следует перенаправить подробный вывод.
-
using - Псевдоним базы данных, на котором будет выполняться команда.
-
plan - План миграции, который будет использован для выполнения миграции. Хотя план не является общедоступным API, это позволяет решать редкие случаи, когда необходимо знать план. План — это список пар «ключ-значение», где первый элемент — экземпляр класса миграции, а второй — показывает, была ли миграция отменена (
True) или применена (False). -
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 - Потокоподобный объект, куда должен быть перенаправлен подробный вывод.
-
using - Псевдоним базы данных, используемый для синхронизации. По умолчанию используется база данных
default. -
plan - План миграции, который использовался для выполнения миграции. Хотя план не является частью публичного API, это позволяет в редких случаях узнать план. План представляет собой список пар 2-кортежей, где первый элемент — экземпляр класса миграции, а второй элемент — информация о том, была ли миграция отменена (
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(). Экземпляры AppConfig пересоздаются для тестов, выполняемых с изменённым набором INSTALLED_APPS (например, когда настройки переопределяются), и такие сигналы должны быть подключены для каждого нового экземпляра AppConfig.
Сигналы запроса/ответа
Сигналы, отправляемые основной системой при обработке запроса.
Предупреждение
Сигналы могут усложнить поддержку кода. Рассмотрите возможность использования middleware перед использованием сигналов запроса/ответа.
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().
На самом деле он отправляется дважды: когда новое значение применяется («настройка») и когда исходное значение восстанавливается («разборка»). Используйте аргумент enter для различения этих двух случаев.
Вы также можете импортировать этот сигнал из django.core.signals, чтобы избежать импорта из django.test в ситуациях, не связанных с тестированием.
Аргументы, передаваемые с этим сигналом:
-
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/5.0/ref/signals/