Spec-Zone.ru › Django 5.1

Сигналы

Список всех сигналов, которые отправляет 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, это позволяет в редких случаях, когда необходимо знать план. План представляет собой список пар из 2-х элементов, где первый элемент — экземпляр класса миграции, а второй элемент показывает, была ли миграция отката (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.1/ref/signals/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API