针对“基于Django signals 信号作用及用法详解”的完整攻略,我将从以下几个方面为您做出详细讲解:
- 什么是Django signals信号?
- Django signals信号的作用是什么?
- Django signals信号的使用步骤
- 示例1:在添加或更新Model时向消息队列写入新数据
- 示例2:注册一个新用户时向管理员发送电子邮件提示
接下来我们逐一讲解:
1.什么是Django signals信号?
Django signals信号是一种消息传递机制,用于将一个应用程序的状态或操作通知到其他应用程序。信号可以在Django框架中的任何地方发送,而不仅仅是限制在视图函数中,使得我们可以更高效地编写应用程序。
Django signals由Django提供的一个内置应用程序django.dispatch
来实现,在进行开发时无需手动安装。
2. Django signals信号的作用是什么?
Django signals信号最常见的作用是与Model相关,当Model中的某个事件(如新增,删除,修改等)发生时,就会触发相应的信号,并将信号传递给其他应用或处理程序。
对于开发者来说,Django signals信号的作用可以总结为以下两个方面:
- 让应用程序更高效:Django的信号传递机制可以使我们的代码更加松耦合,让不同的应用程序之间进行更加合理高效的交互。
- 让应用程序更加扩展:通过使用已有信号或者添加自定义信号,我们可以更加灵活的编写和扩展应用程序。
3. Django signals信号的使用步骤
使用Django signals信号需要三个步骤:定义(定义信号),接收(定义处理函数)和连接(将信号和处理函数进行连接)。
定义信号:
定义信号需要使用Django提供的装饰器@receiver
,该装饰器接受信号(如post_save)作为参数,可以在需要时添加@sender标志,来指定Model
from django.dispatch import receiver
from django.db.models.signals import post_save
from .models import MyModel
@receiver(post_save, sender=MyModel)
def my_handler(sender, **kwargs):
pass
定义处理函数:
处理函数要根据信号的实际表现来编写。例如我们使用post_save
信号时,通常我们编写模型保存后执行的动作。例如:
from django.dispatch import receiver
from django.db.models.signals import post_save
from .models import MyModel
@receiver(post_save, sender=MyModel)
def my_handler(sender, instance, created, **kwargs):
if created:
# 模型实例被创建后执行的操作
pass
else:
# 模型实例被更新后执行的操作
pass
将信号和处理函数进行连接:
最后一步是将信号和处理函数进行连接:
from .signals import my_handler
from .models import MyModel
post_save.connect(my_handler, sender=MyModel)
此时我们就已经将post_save
信号和MyModel
模型的操作进行了关联,当保存或更新MyModel
时,程序将自动发送信号并执行my_handler
函数。
4. 示例1:在添加或更新Model时向消息队列写入新数据
假设我们的应用程序需要实现以下需求:当我们添加或更新一个新的Blog
时,需要统计该Blog
的标题长度并将其写入消息队列,以供其他程序或系统进行进一步操作。
首先,我们需要安装适当的库(以下示例使用pika):
pip install pika
from django.db.models.signals import post_save
from django.dispatch import receiver
import pika
from blog.models import Blog
@receiver(post_save, sender=Blog)
def blog_saved(sender, instance, created, **kwargs):
if created:
length = len(instance.title)
# 连接到 rabbitmq 服务器
connection = pika.BlockingConnection(
pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
# 声明一个消息队列
channel.queue_declare(queue='blog_length')
# 发送消息
channel.basic_publish(exchange='',
routing_key='blog_length',
body=str(length))
connection.close()
然后,我们需要在settings.py
文件中找到INSTALLED_APPS
键,并将其添加到其他应用程序
INSTALLED_APPS = [
……
'blog',
……
]
最后,在blog应用程序中的apps.py
文件中添加以下信号的代码:
from django.apps import AppConfig
class BlogConfig(AppConfig):
name = 'blog'
def ready(self):
import blog.signals
现在,当我们将新的Blog
存储到数据库中时,我们已经可以操作其标题长度并将其写入队列。
注意:为了使用上述代码,我们需要有一个本地运行的 RabbitMQ 服务器运行在本地。
5. 示例2:注册一个新用户时向管理员发送电子邮件提示
假设我们的应用程序需要实现以下需求:当有用户注册成功时,要向管理员发送电子邮件通知,以便及时处理异常问题。
我们首先要安装适当的库(以下示例使用django.core.mail):
pip install django.core.mail
然后,我们编写以下代码来定义信号及其处理方法:
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from django.core.mail import send_mail
@receiver(post_save, sender=User)
def user_saved(sender, instance, created, **kwargs):
if created:
send_mail('New User Registraion',
f'A new user {instance.username} registered at your site!',
'from@example.com',
['admin@example.com'],
fail_silently=False)
然后我们仍然需要在settings.py
中的INSTALLED_APPS
列表中添加django.contrib.auth
应用程序:
INSTALLED_APPS = [
……
'django.contrib.auth',
……
]
最后,在项目的任何地方调用以下代码以将其与信号连接:
from django.contrib.auth.models import User
from django.db.models.signals import post_save
from mainapp.modles import user_saved
post_save.connect(user_saved, sender=User)
现在,当有新用户注册时,管理员将会收到由send_mail
函数生成的电子邮件通知。
到此为止,以上就是Django signals信号的作用及用法的详细说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Django signals 信号作用及用法详解 - Python技术站