📜  django 内置信号 - Python (1)

📅  最后修改于: 2023-12-03 15:30:29.966000             🧑  作者: Mango

Django 内置信号

Django 的信号系统允许应用程序中的代码在特定事件发生时接收通知。这些事件可以是任何事情,从注册用户到修改模型实例。信号系统让开发人员能够将特定的行为与应用程序中的特定事件相关联。

信号的概念

信号是一种观察者模式的实现。在这种模式中,有一个被观察的主题(subject),当发生改变时,会通知它的观察者(observers)。在Django中,主题是一个发送信号的组件,而观察者则是接收这些信号并对其做出反应的函数。

Django 内置信号

Django 内置了很多信号,这些信号覆盖了各种事件,包括但不限于数据库操作、用户登录、请求响应、用户退出等。以下是一些常见的 Django 内置信号:

  • pre_init:在模型实例初始化之前发送。
  • post_init:在模型实例初始化之后发送。
  • pre_save:在模型实例保存到数据库之前发送。
  • post_save:在模型实例保存到数据库之后发送。
  • pre_delete:在模型实例从数据库中删除之前发送。
  • post_delete:在模型实例从数据库中删除之后发送。
  • request_started:在每个 HTTP 请求开始时发送。
  • request_finished:在每个 HTTP 请求结束时发送。
  • got_request_exception:在 HTTP 请求引发异常时发送。
  • user_logged_in:在用户登录时发送。
  • user_logged_out:在用户注销时发送。
  • user_login_failed:在用户尝试登录但失败时发送。
  • session_started:在会话开始时发送。
  • session_ended:在会话结束时发送。
Django 信号的用法

要使用 Django 内置信号,需要从 django.dispatch 模块中导入 Signal。使用此类创建一个信号,并为此信号注册获得通知的函数。

from django.dispatch import Signal

my_signal = Signal()

def my_signal_handler(sender, **kwargs):
    print("I received a signal from", sender)

my_signal.connect(my_signal_handler)

要发送信号,请调用 Signal.send() 方法,并将发送者作为第一个参数传递。

my_signal.send(sender="my_module")

输出:

I received a signal from my_module

信号处理函数中的第一个参数 sender 表示发送信号的对象。其他的关键字参数由信号本身提供,这些参数可以为函数提供有用的上下文信息。

总结

Django 的内置信号提供了一种强大的机制,用于向应用程序的其他组件通知事件发生。了解常用的内置信号,以及如何注册和接收它们,可以帮助开发人员更好地构建可扩展的应用程序。