当前位置: 首页 > news >正文

找做网站朝阳seo排名

找做网站,朝阳seo排名,新手做网站的注意事项,h5编辑器免费版目录 信号的工作机制信号的应用场景两个简单例子Django常用内置信号如何放置信号监听函数代码自定义信号第一步:自定义信号第二步:触发信号第三步:将监听函数与信号相关联 信号的工作机制 Django 框架包含了一个信号机制,它允许若…

目录

    • 信号的工作机制
    • 信号的应用场景
    • 两个简单例子
    • Django常用内置信号
    • 如何放置信号监听函数代码
    • 自定义信号
      • 第一步:自定义信号
      • 第二步:触发信号
      • 第三步:将监听函数与信号相关联

信号的工作机制

Django 框架包含了一个信号机制,它允许若干个发送者(sender)通知一组接收者(receiver)某些特定操作或事件(events)已经发生了, 接收者收到指令信号(signals)后再去执行特定的操作。

Django 中的信号工作机制依赖如下三个主要要素:

  • 发送者(sender):信号的发出方,可以是模型,也可以是视图。当某个操作发生时,发送者会发出信号。
  • 信号(signal):发送的信号本身。Django内置了许多信号,比如模型保存后发出的post_save信号。
  • 接收者(receiver):信号的接收者,其本质是一个简单的回调函数。将这个函数注册到信号上,当特定的事件发生时,发送者发送信号,回调函数就会被执行。

信号的应用场景

信号主要用于Django项目内不同事件的联动,实现程序的解耦。比如当模型A有变动时,模型B与模型C收到发出的信号后同步更新。又或当一个数据表数据有所改变时,监听这个信号的函数可以及时清除已失效的缓存。另外通知也是一个信号常用的场景,比如有人刚刚回复了你的贴子,可以通过信号进行推送。

注意:Django中信号监听函数不是异步执行,而是同步执行,所以需要异步执行耗时的任务时(比如发送邮件或写入文件),不建议使用Django自带的信号。

两个简单例子

假如我们有一个Profile模型,与User模型是一对一的关系。我们希望创建User对象实例时自动创建Profile对象实例,而更新User对象实例时不创建新的Profile对象实例。这时我们就可以自定义 create_user_profilesave_user_profile两个监听函数,同时监听sender (User模型)发出的post_save信号。由于post_save可同时用于模型的创建和更新,我们用if created这个判断来加以区别。

from django.db import models
from django.db.models.signals import post_save
from django.dispatch import receiverclass Profile(models.Model):user = models.OneToOneField(User, on_delete=models.CASCADE)birth_date = models.DateField(null=True, blank=True)# 监听User模型创建    
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):if created:Profile.objects.create(user=instance)# 监听User模型更新  
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):instance.profile.save()

我们再来看一个使用信号清除缓存的例子。当模型A被更新或被删除时,会分别发出post_savepost_delete的信号,监听这两个信号的receivers函数会自动清除缓存里的A对象列表。

from django.core.cache import cache
from django.db.models.signals import post_delete, post_save
from django.dispatch import receiver@receiver(post_save, sender=ModelA)
def cache_post_save_handler(sender, **kwargs):cache.delete('cached_a_objects')@receiver(post_delete, sender=ModelA)
def cache_post_delete_handler(sender, **kwargs):cache.delete('cached_a_objects')

注意:有时为了防止信号多次发送,可以通过dispatch_uid给receiver函数提供唯一标识符。

@receiver(post_delete, sender=ModelA, dispatch_uid = "unique_identifier")

Django常用内置信号

前面例子我们仅仅使用了post_savepost_delete信号。Django还内置了其它常用信号:

  • pre_save & post_save: 在模型调用 save()方法之前或之后发送。
  • pre_init& post_init: 在模型调用_init_方法之前或之后发送。
  • pre_delete & post_delete: 在模型调用delete()方法或查询集调用delete() 方法之前或之后发送。
  • m2m_changed: 在模型多对多关系改变后发送。
  • request_started & request_finished: Django建立或关闭HTTP 请求时发送。

这些信号都非常有用。举个例子:使用pre_save信号可以在将用户的评论存入数据库前对其进行过滤,或则检测一个模型对象的字段是否发生了变更。

注意:监听pre_savepost_save信号的回调函数不能再调用save()方法,否则回出现死循环。另外Django的update方法不会发出pre_savepost_save的信号。

如何放置信号监听函数代码

在之前案例中,我们将Django信号的监听函数写在了models.py文件里。当一个app的与信号相关的自定义监听函数很多时,此时models.py代码将变得非常臃肿。一个更好的方式把所以自定义的信号监听函数集中放在app对应文件夹下的signals.py文件里,便于后期集中维护。

假如我们有个account的app,包含了User和Profile模型,我们首先需要在account文件夹下新建signals.py,如下所示:

# account/signals.py
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import User, Profile@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):if created:Profile.objects.create(user=instance)@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):instance.profile.save()

接下来我们需要修改account文件下apps.py__init__.py,以导入创建的信号监听函数。

# apps.py
from django.apps import AppConfigclass AccountConfig(AppConfig):name = 'account'def ready(self):import account.signals# account/__init__.py中增加如下代码:
default_app_config = 'account.apps.AccountConfig'

自定义信号

Django的内置信号在大多数情况下能满足我们的项目需求,但有时我们还需要使用自定义的信号。在Django项目中使用自定义信号也比较简单,分三步即可完成。

第一步:自定义信号

每个自定义的信号,都是Signal类的实例。这里我们首先在app目录下新建一个signals.py文件,创建一个名为my_signal的信号,它包含有msg这个参数,这个参数在信号触发的时候需要传递。当监听函数收到这个信号时,会得到msg参数的值。

from django.dispatch import Signalmy_signal = Signal(providing_args=['msg'])

第二步:触发信号

视图中进行某个操作时可以使用send方法触发自定义的信号,并设定msg的值。

from . import signals
# Create your views here.def index(request):signals.my_signal.send(sender=None, msg='Hello world')return render(request, template_name='index.html')

第三步:将监听函数与信号相关联

from django.dispatch import Signal, Receivermy_signal = Signal(providing_args=['msg'])@receiver(my_signal)
def my_signal_callback(sender, **kwargs):print(kwargs['msg']) # 打印Hello world!

这样每当用户访问/index/视图时,Django都会发出my_signal的信号(包含msg这个参数)。回调函数收到这个信号后就会打印出msg的值来。

参考:https://pythondjango.cn/django/advanced/10-signala/

http://www.khdw.cn/news/16925.html

相关文章:

  • 网站图片上的分享怎么做培训心得体会范文大全2000字
  • wordpress二维码插件广州百度快速优化排名
  • 网站建设西安seo关键词如何布局
  • seo关键词排名怎么提升seo描述快速排名
  • 海口网站建设方案咨询淘宝怎样优化关键词
  • 柯桥区网站建设网络营销策略存在的问题
  • 绍兴 网站制作当日alexa排名查询统计
  • c 做网站需要什么知识自己可以做网站吗
  • 海南行指专业网站开发域名解析ip地址查询
  • 做网站大概要多少全国疫情高峰时间表最新
  • 全屏的翻页网站这么做如何进行seo
  • 白玉网站建设百度搜索排名推广
  • 网站内链如何做优化网店推广有哪些方法
  • 怎样让网站被百度收录免费b站推广网站2023
  • 长沙个人做网站排名b2b多平台一键发布
  • 做社情网站犯法怎么办淘宝标题优化工具推荐
  • 河北固安建设局网站seo学校
  • 用电脑做兼职的网站比较好中囯联通腾迅
  • 江门网站制作设计网络营销推广方式案例
  • 东莞常平做网站公司微信营销成功案例8个
  • 网站开发表格服装营销方式和手段
  • 西宁网站建设公司2023年3月份疫情严重
  • 常见的微网站平台有哪些方面百度公司招聘官网最新招聘
  • wordpress 首页 动关键词优化软件排行
  • 网站开发中 敬请期待网站工具查询
  • Iis 建网站为什么说没有该用户网络优化大师app
  • 金昌网站建设360优化大师官方下载最新版
  • 做网站开票几个税点免费网站在线观看人数在哪
  • 网站整体设计如何提升网站搜索排名
  • 宣传片制作公司南京青岛关键词推广seo