Сигналы
Список всех сигналов, которые отправляет 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 -
Новое в Django 4.1.
Источник удаления — экземпляр класса
ModelилиQuerySet.
post_delete
-
django.db.models.signals.post_delete
Как pre_delete, но отправляется в конце метода delete() модели и метода delete() набора результатов запроса.
Аргументы, передаваемые с этим сигналом:
-
sender - Класс модели.
-
instance -
Удалимый экземпляр.
Обратите внимание, что объект больше не будет в базе данных, поэтому будьте очень осторожны с этим экземпляром.
-
using - Используемый псевдоним базы данных.
-
origin -
Новое в Django 4.1.
Источник удаления — экземпляр класса
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, он позволяет в редких случаях узнать план. План представляет собой список пар из двух кортежей, где первый элемент — экземпляр класса миграции, а второй — показывает, была ли миграция откачена (
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.
Сигналы запроса/ответа
Сигналы, отправляемые основным фреймворком при обработке запроса.
Предупреждение
Сигналы могут усложнить поддержку вашего кода. Рассмотрите использование мидлвера перед использованием сигналов запроса/ответа.
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/4.2/ref/signals/