• 3.1
  • 5.0
  • 6.1
  • Версия документации: 3.2

Сигналы

Список всех сигналов, которые отправляет 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, будут следующими:

Аргумент

Значение

отправитель

Вопрос (сам класс)

args

[] (пустой список, поскольку в __init__() не было передано позиционных аргументов)

кварги

{'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__().

Аргументы, отправленные с этим сигналом:

отправитель

Как указано выше: класс модели, экземпляр которого только что был создан.

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; True if 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; True if 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 в приведенном выше примере), будут следующими:

Аргумент

Значение

отправитель

Pizza.toppings.through (промежуточный класс m2m)

instance

p (экземпляр Pizza изменяется)

действие

"pre_add" (за которым следует отдельный сигнал с "post_add")

reverse

False (Pizza содержит ManyToManyField, поэтому этот вызов изменяет прямое отношение)

модель

Topping (класс объектов, добавляемых в Пиццу)

pk_set

{t.id} (поскольку к отношению был добавлен только Topping t)

используя

"default" (поскольку маршрутизатор по умолчанию отправляет записи сюда)

And if we would then do something like this:

>>> t.pizza_set.remove(p)

аргументы, отправленные обработчику m2m_changed, будут следующими:

Аргумент

Значение

отправитель

Pizza.toppings.through (промежуточный класс m2m)

instance

t (экземпляр Topping изменяется)

действие

"pre_remove" (за которым следует отдельный сигнал с "post_remove")

reverse

True (Pizza содержит ManyToManyField, поэтому этот вызов изменяет обратное отношение)

модель

Пицца (класс объектов, убранных из Топинга)

pk_set

{p.id} (поскольку из отношения была удалена только Pizza p)

используя

"default" (поскольку маршрутизатор по умолчанию отправляет записи сюда)

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 --verbosity flag 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 --verbosity flag 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 — он доступен только во время тестирования.

Аргументы, отправленные с этим сигналом:

отправитель

Отрисованный объект Template.

шаблон

То же, что отправитель

контекст

Context, с помощью которого был отображен шаблон.

Обертки баз данных

Сигналы, отправляемые оболочкой базы данных при инициировании соединения с базой данных.

connection_created

django.db.backends.signals.connection_created

Отправляется, когда оболочка базы данных устанавливает первоначальное соединение с базой данных. Это особенно полезно, если вы хотите отправить какие-либо команды после подключения на серверную часть SQL.

Аргументы, отправленные с этим сигналом:

отправитель

Класс-оболочка базы данных, т. е. django.db.backends.postgresql.DatabaseWrapper или django.db.backends.mysql.DatabaseWrapper и т. д.

соединение

Открытое соединение с базой данных. Это можно использовать в конфигурации с несколькими базами данных, чтобы различать сигналы подключения из разных баз данных.

Back to Top