Сигналы¶
Список всех сигналов, которые отправляет Django. Все встроенные сигналы отправляются с использованием метода send().
См.также
См. документацию по диспетчеру сигналов для получения информации о том, как зарегистрироваться и получать сигналы.
Среда аутентификации отправляет сигналы, когда пользователь входит в систему или выходит из нее.
Модельные сигналы¶
Модуль django.db.models.signals определяет набор сигналов, отправляемых модельной системой.
Предупреждение
Многие из этих сигналов отправляются различными методами модели, такими как __init__() или save(), которые вы можете переопределить в своем собственном коде.
Если вы переопределяете эти методы в своей модели, вам необходимо вызвать методы родительского класса для отправки этих сигналов.
Также обратите внимание, что Django по умолчанию хранит обработчики сигналов как слабые ссылки, поэтому, если ваш обработчик является локальной функцией, он может быть подвергнут сборке мусора. Чтобы предотвратить это, передайте weak=False при вызове connect`() сигнала.
Примечание
Модель сигналов модели «отправитель» может быть лениво использована при подключении получателя, указав ее полную метку приложения. Например, модель «Вопрос», определенная в приложении «опросы», может называться «polls.Question». Такого рода ссылки могут быть весьма полезны при работе с зависимостями циклического импорта и моделями с возможностью замены.
pre_init¶
- django.db.models.signals.pre_init¶
Всякий раз, когда вы создаете экземпляр модели Django, этот сигнал отправляется в начале метода модели __init__().
Аргументы, отправленные с этим сигналом:
отправительКласс модели, экземпляр которого только что был создан.
argsСписок позиционных аргументов, передаваемых в
__init__().кваргиСловарь аргументов ключевого слова, передаваемый в
__init__().
Например, в tutorial есть такая строка:
q = Question(question_text="What's new?", pub_date=timezone.now())
Аргументы, отправленные в обработчик pre_init, будут следующими:
Аргумент |
Значение |
|---|---|
|
|
|
|
|
|
post_init¶
- django.db.models.signals.post_init¶
Похож на pre_init, но он отправляется после завершения метода __init__().
Аргументы, отправленные с этим сигналом:
отправительКак указано выше: класс модели, экземпляр которого только что был создан.
instanceФактический экземпляр только что созданной модели.
Примечание
instance._stateне устанавливается перед отправкой сигналаpost_init, поэтому атрибуты_stateвсегда имеют значения по умолчанию. Например,_state.dbимеет значениеNone.
Предупреждение
По соображениям производительности не следует выполнять запросы в приемниках сигналов pre_init или post_init, поскольку они будут выполняться для каждого экземпляра, возвращаемого во время итерации набора запросов.
pre_save¶
- django.db.models.signals.pre_save¶
Это отправляется в начале метода модели save().
Аргументы, отправленные с этим сигналом:
отправительМодельный класс.
instanceФактический экземпляр сохраняется.
сыройA boolean;
Trueif the model is saved exactly as presented (i.e. when loading a fixture). One should not query/modify other records in the database as the database might not be in a consistent state yet.используяИспользуемый псевдоним базы данных.
update_fieldsНабор полей для обновления, переданный в
Model.save(), илиNone, еслиupdate_fieldsне был передан вsave().
post_save¶
- django.db.models.signals.post_save¶
Подобно pre_save, но отправляется в конце метода save().
Аргументы, отправленные с этим сигналом:
отправительМодельный класс.
instanceФактический экземпляр сохраняется.
созданЛогическое значение;
True, если была создана новая запись.сыройA boolean;
Trueif the model is saved exactly as presented (i.e. when loading a fixture). One should not query/modify other records in the database as the database might not be in a consistent state yet.используяИспользуемый псевдоним базы данных.
update_fieldsНабор полей для обновления, переданный в
Model.save(), илиNone, еслиupdate_fieldsне был передан вsave().
pre_delete¶
- django.db.models.signals.pre_delete¶
Отправляется в начале метода delete() модели и метода delete() набора запросов.
Аргументы, отправленные с этим сигналом:
отправительМодельный класс.
instanceФактический экземпляр удаляется.
используяИспользуемый псевдоним базы данных.
post_delete¶
- django.db.models.signals.post_delete¶
Подобно pre_delete, но отправляется в конце метода delete() модели и метода delete() набора запросов.
Аргументы, отправленные с этим сигналом:
отправительМодельный класс.
instanceФактический экземпляр удаляется.
Обратите внимание, что объекта больше не будет в базе данных, поэтому будьте очень осторожны, что вы делаете с этим экземпляром.
используяИспользуемый псевдоним базы данных.
m2m_changed¶
- django.db.models.signals.m2m_changed¶
Отправляется, когда ManyToManyField изменяется в экземпляре модели. Строго говоря, это не сигнал модели, поскольку он отправляется ManyToManyField, но поскольку он дополняет pre_save/post_save и pre_delete/post_delete, когда дело доходит до отслеживания изменений в моделях, он включается сюда.
Аргументы, отправленные с этим сигналом:
отправительПромежуточный класс модели, описывающий
ManyToManyField. Этот класс создается автоматически при определении поля «многие-ко-многим»; вы можете получить к нему доступ, используя атрибут «through» в поле «многие ко многим».instanceЭкземпляр, отношение «многие ко многим» которого обновляется. Это может быть экземпляр отправителя или класса, с которым связан
ManyToManyField.действиеСтрока, указывающая тип обновления, выполняемого в отношении. Это может быть одно из следующих:
"pre_add"Отправляется до добавления в отношение одного или нескольких объектов.
"post_add"Отправляется после добавления в отношение одного или нескольких объектов.
"pre_remove"Отправлено до удаления одного или нескольких объектов из отношения.
"post_remove"Отправляется после удаления одного или нескольких объектов из отношения.
"pre_clear"Отправлено до очистки связи.
"post_clear"Отправляется после очистки связи.
reverseУказывает, какая сторона отношения обновляется (т. е. изменяется ли прямое или обратное отношение).
модельКласс объектов, которые добавляются в отношение, удаляются из него или удаляются из него.
pk_setДля действий
pre_addиpost_addэто набор значений первичного ключа, которые будут или были добавлены в отношение. Это может быть подмножество значений, отправленных для добавления, поскольку вставки должны фильтровать существующие значения, чтобы избежать ошибки целостности базы данных.Для действий pre_remove и post_remove это набор значений первичного ключа, который был отправлен для удаления из отношения. Это не зависит от того, будут ли значения фактически удалены или были удалены. В частности, могут быть отправлены несуществующие значения, которые появятся в pk_set, даже если они не влияют на базу данных.
Для действий pre_clear и post_clear это значение None.
используяИспользуемый псевдоним базы данных.
Например, если «Пицца» может иметь несколько объектов «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)
and then did something like this:
>>> p = Pizza.objects.create(...)
>>> t = Topping.objects.create(...)
>>> p.toppings.add(t)
аргументы, отправленные обработчику m2m_changed (toppings_changed в приведенном выше примере), будут следующими:
Аргумент |
Значение |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
And if we would then do something like this:
>>> t.pizza_set.remove(p)
аргументы, отправленные обработчику m2m_changed, будут следующими:
Аргумент |
Значение |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class_prepared¶
- django.db.models.signals.class_prepared¶
Sent whenever a model class has been «prepared» – that is, once model has been defined and registered with Django’s model system. Django uses this signal internally; it’s not generally used in third-party applications.
Поскольку этот сигнал отправляется во время процесса заполнения реестра приложений, а AppConfig.ready() запускается после того, как реестр приложений полностью заполнен, получатели не могут быть подключены этим методом. Одна из возможностей — вместо этого подключить их AppConfig.__init__(), стараясь не импортировать модели и не вызывать вызовы в реестр приложений.
Аргументы, которые отправляются с этим сигналом:
отправительТолько что подготовленный модельный класс.
Сигналы управления¶
Сигналы отправляются django-admin.
pre_migrate¶
- django.db.models.signals.pre_migrate¶
Отправляется командой migrate перед началом установки приложения. Он не генерируется для приложений, в которых отсутствует модуль «модели».
Аргументы, отправленные с этим сигналом:
отправительЭкземпляр
AppConfigдля приложения, которое будет перенесено/синхронизировано.app_configТо же, что и «отправитель».
многословиеIndicates how much information manage.py is printing on screen. See the
--verbosityflag for details.Функции, которые прослушивают
pre_migrate, должны корректировать то, что они выводят на экран, в зависимости от значения этого аргумента.интерактивныйЕсли
interactiveимеет значениеTrue, можно безопасно предложить пользователю ввести данные в командной строке. Еслиinteractiveимеет значениеFalse, функции, которые прослушивают этот сигнал, не должны пытаться что-либо запрашивать.Например, приложение
django.contrib.authпредлагает создать суперпользователя только тогда, когдаinteractiveимеет значениеTrue.используяПсевдоним базы данных, над которой будет работать команда.
планThe migration plan that is going to be used for the migration run. While the plan is not public API, this allows for the rare cases when it is necessary to know the plan. A plan is a list of two-tuples with the first item being the instance of a migration class and the second item showing if the migration was rolled back (
True) or applied (False).приложенияЭкземпляр
Apps, содержащий состояние проекта перед запуском миграции. Его следует использовать вместо глобального реестраappsдля получения моделей, над которыми вы хотите выполнять операции.
post_migrate¶
- django.db.models.signals.post_migrate¶
Отправляется в конце команд migrate (даже если миграция не выполняется) и flush. Он не генерируется для приложений, в которых отсутствует модуль «модели».
Обработчики этого сигнала не должны выполнять изменения схемы базы данных, поскольку это может привести к сбою команды flush, если она выполняется во время команды migrate.
Аргументы, отправленные с этим сигналом:
отправительЭкземпляр
AppConfigдля только что установленного приложения.app_configТо же, что и «отправитель».
многословиеIndicates how much information manage.py is printing on screen. See the
--verbosityflag for details.Функции, которые прослушивают
post_migrate, должны корректировать то, что они выводят на экран, в зависимости от значения этого аргумента.интерактивныйЕсли
interactiveимеет значениеTrue, можно безопасно предложить пользователю ввести данные в командной строке. Еслиinteractiveимеет значениеFalse, функции, которые прослушивают этот сигнал, не должны пытаться что-либо запрашивать.Например, приложение
django.contrib.authпредлагает создать суперпользователя только тогда, когдаinteractiveимеет значениеTrue.используяПсевдоним базы данных, используемый для синхронизации. По умолчанию используется база данных
default.планThe migration plan that was used for the migration run. While the plan is not public API, this allows for the rare cases when it is necessary to know the plan. A plan is a list of two-tuples with the first item being the instance of a migration class and the second item showing if the migration was rolled back (
True) or applied (False).приложенияЭкземпляр
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(). AppConfigs воссоздаются для тестов, которые выполняются с измененным набором INSTALLED_APPS (например, когда настройки переопределяются), и такие сигналы должны быть подключены для каждого нового экземпляра AppConfig.
Сигналы запроса/ответа¶
Сигналы, отправляемые базовой платформой при обработке запроса.
request_started¶
- django.core.signals.request_started¶
Отправляется, когда Django начинает обработку HTTP-запроса.
Аргументы, отправленные с этим сигналом:
отправительКласс обработчика - например.
django.core.handlers.wsgi.WsgiHandler– который обработал запрос.окружающая средаСловарь
environ, предоставленный запросу.
request_finished¶
- django.core.signals.request_finished¶
Отправляется, когда Django завершает доставку HTTP-ответа клиенту.
Аргументы, отправленные с этим сигналом:
отправительКласс обработчика, как указано выше.
got_request_Exception¶
- django.core.signals.got_request_exception¶
Этот сигнал отправляется всякий раз, когда Django обнаруживает исключение при обработке входящего HTTP-запроса.
Аргументы, отправленные с этим сигналом:
отправительНе используется (всегда
Нет).запросОбъект
HttpRequest.
Тестовые сигналы¶
Сигналы отправляются только тогда, когда выполняются тесты.
setting_changed¶
- django.test.signals.setting_changed¶
Этот сигнал отправляется, когда значение параметра изменяется через контекстный менеджер django.test.TestCase.settings() или декоратор/контекстный менеджер django.test.override_settings.
На самом деле оно отправляется дважды: когда применяется новое значение («настройка») и когда восстанавливается исходное значение («снос»). Используйте аргумент enter, чтобы различать их.
Вы также можете импортировать этот сигнал из django.core.signals, чтобы избежать импорта из django.test в нетестовых ситуациях.
Аргументы, отправленные с этим сигналом:
отправительОбработчик настроек.
настройкаНазвание настройки.
valueЗначение параметра после изменения. Для настроек, которые изначально не существуют, на этапе «удаления» значением является «Нет».
входЛогическое значение;
True, если настройка применена,False, если она восстановлена.
template_rendered¶
- django.test.signals.template_rendered¶
Отправляется, когда тестовая система отображает шаблон. Этот сигнал не генерируется во время нормальной работы сервера Django — он доступен только во время тестирования.
Аргументы, отправленные с этим сигналом:
Обертки баз данных¶
Сигналы, отправляемые оболочкой базы данных при инициировании соединения с базой данных.
connection_created¶
- django.db.backends.signals.connection_created¶
Отправляется, когда оболочка базы данных устанавливает первоначальное соединение с базой данных. Это особенно полезно, если вы хотите отправить какие-либо команды после подключения на серверную часть SQL.
Аргументы, отправленные с этим сигналом:
отправительКласс-оболочка базы данных, т. е.
django.db.backends.postgresql.DatabaseWrapperилиdjango.db.backends.mysql.DatabaseWrapperи т. д.соединениеОткрытое соединение с базой данных. Это можно использовать в конфигурации с несколькими базами данных, чтобы различать сигналы подключения из разных баз данных.