Spec-Zone.ru › Django 2.0

Сигналы

Список всех сигналов, отправляемых Django. Все встроенные сигналы отправляются с помощью метода send().

См. также

См. документацию по диспетчеру сигналов для получения информации о регистрации и получении сигналов.

Фреймворк аутентификации отправляет сигналы при входе/выходе пользователя.

Сигналы моделей

Модуль django.db.models.signals определяет набор сигналов, отправляемых системой моделей.

Предупреждение

Многие из этих сигналов отправляются различными методами модели, такими как __init__() или save(), которые вы можете переопределить в своём коде.

Если вы переопределяете эти методы в своей модели, вы должны вызывать методы родительского класса, чтобы эти сигналы отправлялись.

Обратите также внимание, что Django хранит обработчики сигналов в качестве слабых ссылок по умолчанию, поэтому, если ваш обработчик — локальная функция, он может быть удалён сборщиком мусора. Чтобы этого избежать, передайте weak=False при вызове метода connect() сигнала.

Примечание

Сигналы моделей sender модели могут быть обработаны лениво при подключении приемника, указав его полное имя приложения. Например, модель Answer , определённая в приложении polls, может быть указана как 'polls.Answer'. Такой способ ссылки очень удобен при работе с циклическими зависимостями импорта и взаимозаменяемыми моделями.

pre_init

django.db.models.signals.pre_init

Всякий раз, когда вы создаёте экземпляр модели Django, этот сигнал отправляется в начале метода __init__() модели.

Передаваемые аргументы с этим сигналом:

sender
Класс модели, у которой только что был создан экземпляр.
args
Список позиционных аргументов, переданных в __init__().
kwargs
Словарь ключевых аргументов, переданных в __init__().

Например, в учебнике есть такая строка:

p = Poll(question="What's up?", pub_date=datetime.now())

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

Аргумент Значение
sender Poll (сам класс)
args [] (пустой список, так как позиционных аргументов в __init__() не было.)
kwargs {'question': "What's up?", 'pub_date': datetime.now()}

post_init

django.db.models.signals.post_init

Как и pre_init, но этот сигнал отправляется, когда метод __init__() завершает работу.

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

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

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
Используемый псевдоним базы данных.

post_delete

django.db.models.signals.post_delete

Как pre_delete, но отправляется в конце метода delete() модели и метода delete() набора данных.

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

sender
Класс модели.
instance

Фактический удаляемый экземпляр.

Обратите внимание, что объект больше не будет в базе данных, поэтому будьте очень осторожны с этим экземпляром.

using
Используемый псевдоним базы данных.

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, pre_remove и post_remove, это набор значений первичных ключей, которые были добавлены или удалены из связи.

Для действий 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.

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.

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
Класс обработчика, как выше.
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/2.0/ref/signals/

Spec-Zone.ru

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