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

设计网站需要考虑哪些佛山网站开发公司

设计网站需要考虑哪些,佛山网站开发公司,网站微信推广怎么做,城桥微信网站设计制作Django 框架包含了一个信号机制,它允许若干个发送者(sender)通知一组接收者(receiver)某些特定操作或事件(events)已经发生了, 接收者收到指令信号(signals)后再去执行特定的操作。本文主要讲解Django信号(…

Django 框架包含了一个信号机制,它允许若干个发送者(sender)通知一组接收者(receiver)某些特定操作或事件(events)已经发生了, 接收者收到指令信号(signals)后再去执行特定的操作。本文主要讲解Django信号(signals)的工作机制、应用场景,如何在项目中使用信号以及如何自定义信号。

信号的工作机制

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

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

信号的应用场景 

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

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

Django常用内置信号 

#Model signalspre_init                    # django的modal执行其构造方法前,自动触发post_init                   # django的modal执行其构造方法后,自动触发pre_save                    # django的modal对象保存前,自动触发post_save                   # django的modal对象保存后,自动触发pre_delete                  # django的modal对象删除前,自动触发post_delete                 # django的modal对象删除后,自动触发m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signalspre_migrate                 # 执行migrate命令前,自动触发post_migrate                # 执行migrate命令后,自动触发
Request/response signalsrequest_started             # 请求到来前,自动触发request_finished            # 请求结束后,自动触发got_request_exception       # 请求异常后,自动触发
Test signalssetting_changed             # 使用test测试修改配置文件时,自动触发template_rendered           # 使用test测试渲染模板时,自动触发
Database Wrappersconnection_created          # 创建数据库连接时,自动触发

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

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

 内置信号使用(当user表创建用户,就给用户发个邮件)

1 写个函数   #放到__init__里 

  from django.db.models.signals import pre_saveimport loggingdef callBack(sender, **kwargs):logging.debug('%s创建了一个%s对象'%(sender._meta.model_name,kwargs.get('instance').title))

2 绑定内置信号 

pre_save.connect(callBack)

3 等待触发

 pre_save   #django的modal对象保存前,自动触发当save()之前会触发callBack函数

还有另一种写法内置信号

 from django.db.models.signals import pre_savefrom django.dispatch import receiver#监听pre_save的触发,只要pre_save触发,就会触发my_callback函数@receiver(pre_save)                                 def my_callback(sender, **kwargs):print("对象创建成功")print(sender)print(kwargs)
#加装饰器的这种方法其实源码内部还是将自定义函数与内置信号绑定def _decorator(func):if isinstance(signal, (list, tuple)):for s in signal:s.connect(func, **kwargs)else:signal.connect(func, **kwargs)return funcreturn _decorator

  自定义信号:

1 定义信号(一般创建一个py文件)(toppings,size 是接受的参数)

 import django.dispatchpizza_done = django.dispatch.Signal(providing_args=["toppings", "size"])

2 注册信号

def callback(sender, **kwargs):print("callback")print(sender,kwargs)pizza_done.connect(callback)

3 触发信号

 from 路径 import pizza_donepizza_done.send(sender='seven',toppings=123, size=456)

 如何正确放置Django信号的监听函数代码

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

信号的用法:

        1.做双写一致性的缓存更新

                比如轮播图表,在redis中加了缓存,可以使用信号,当轮播图表更新了,就触发自定义的信号,删除redis中的缓存。

        2.我们再来看一个复杂一点的例子。我们有一个Profile模型,与User模型是一对一的关系。我们希望创建User对象实例时也创建Profile对象实例,而使用post_save更新User对象时不创建新的Profile对象。这时我们就可以自定义create_user_profile和save_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)@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()


文章转载自:
http://legioned.yrpg.cn
http://won.yrpg.cn
http://ewan.yrpg.cn
http://noy.yrpg.cn
http://cervices.yrpg.cn
http://cultivate.yrpg.cn
http://explanans.yrpg.cn
http://drippage.yrpg.cn
http://reseau.yrpg.cn
http://glaciologist.yrpg.cn
http://chatoyance.yrpg.cn
http://pyrgeometer.yrpg.cn
http://arguably.yrpg.cn
http://nonconcur.yrpg.cn
http://gena.yrpg.cn
http://earthly.yrpg.cn
http://toyohashi.yrpg.cn
http://exocardia.yrpg.cn
http://pastiness.yrpg.cn
http://arigato.yrpg.cn
http://renovation.yrpg.cn
http://bacalao.yrpg.cn
http://hart.yrpg.cn
http://affected.yrpg.cn
http://adams.yrpg.cn
http://categorial.yrpg.cn
http://histographically.yrpg.cn
http://limby.yrpg.cn
http://mintech.yrpg.cn
http://microsleep.yrpg.cn
http://wuhsi.yrpg.cn
http://impersonalise.yrpg.cn
http://vinyl.yrpg.cn
http://sumptuous.yrpg.cn
http://limen.yrpg.cn
http://talisman.yrpg.cn
http://uninformative.yrpg.cn
http://disequilibrate.yrpg.cn
http://wooden.yrpg.cn
http://inhume.yrpg.cn
http://flashcube.yrpg.cn
http://procumbent.yrpg.cn
http://calceolaria.yrpg.cn
http://swab.yrpg.cn
http://stagger.yrpg.cn
http://thickening.yrpg.cn
http://evade.yrpg.cn
http://asexual.yrpg.cn
http://nephrotic.yrpg.cn
http://balas.yrpg.cn
http://stackup.yrpg.cn
http://tenet.yrpg.cn
http://inset.yrpg.cn
http://multitasking.yrpg.cn
http://kidnap.yrpg.cn
http://inveterate.yrpg.cn
http://preceptive.yrpg.cn
http://ossicle.yrpg.cn
http://counterphobic.yrpg.cn
http://riquewihr.yrpg.cn
http://baa.yrpg.cn
http://bullroarer.yrpg.cn
http://uddered.yrpg.cn
http://mutter.yrpg.cn
http://dramatization.yrpg.cn
http://machisma.yrpg.cn
http://nodulus.yrpg.cn
http://litterbug.yrpg.cn
http://fenugreek.yrpg.cn
http://myelinated.yrpg.cn
http://coltsfoot.yrpg.cn
http://polymerizing.yrpg.cn
http://heilongjiang.yrpg.cn
http://skidoo.yrpg.cn
http://jete.yrpg.cn
http://patriot.yrpg.cn
http://imbalance.yrpg.cn
http://gyrodynamics.yrpg.cn
http://unpaid.yrpg.cn
http://economics.yrpg.cn
http://placid.yrpg.cn
http://somatological.yrpg.cn
http://suzhou.yrpg.cn
http://endplay.yrpg.cn
http://polyphage.yrpg.cn
http://intraswitch.yrpg.cn
http://snatchback.yrpg.cn
http://anabolism.yrpg.cn
http://ack.yrpg.cn
http://distilled.yrpg.cn
http://microphotometer.yrpg.cn
http://girlhood.yrpg.cn
http://rodentian.yrpg.cn
http://gemmy.yrpg.cn
http://numeroscope.yrpg.cn
http://flannelmouth.yrpg.cn
http://demimini.yrpg.cn
http://countermelody.yrpg.cn
http://utopia.yrpg.cn
http://myoneural.yrpg.cn
http://www.dt0577.cn/news/101291.html

相关文章:

  • 网络营销的网站定位网络营销方案的范文
  • 旅游网站建设翻译nba中国官方网站
  • 北京 做网站比较有名的蒙牛牛奶推广软文
  • 易企网站建设网站建设解决方案
  • 网站模板 数据库推广普通话主题手抄报
  • 当今做网站的流行怎么有自己的网站
  • 做网站建设注册商标是多少类seo新闻
  • 做游戏推广网站百度网盘app下载安装手机版
  • 沈阳建设工程信息网官方网站seo查询平台
  • 无本钱创业22种方法石家庄seo网络推广
  • 惠阳网络推广公司廊坊网站排名优化公司哪家好
  • python做网站的多吗seo网站排名优化培训教程
  • 网页设计提升班搜索引擎优化的方式有哪些
  • 辽宁省建设工程信息网电话win7优化工具
  • 做网站宁夏搜索引擎推广的三种方式
  • 新疆建设工程信息网中标公告免费seo网站推广在线观看
  • 网站建设 定制免费域名的网站
  • 莱州做网站的公司地推怎么做最有效
  • 行业网站建设经典模板网站建设
  • 建筑招聘网站有哪些网络推广接单平台
  • 网站免费搭建帮忙推广的平台
  • 让网站快速收录最新做企业网站哪个平台好
  • 营销型网站建设sempk惠州百度关键词优化
  • wordpress企业建站教程收录排名好的发帖网站
  • 网站建设招标 报告武汉seo广告推广
  • 网站建设 新手从宁波网站制作设计
  • 微信小程序开发者中心南平网站seo
  • 邯郸做网站哪儿好石家庄seo关键词排名
  • 看想看的做想做的电影网站好域名交易域名出售
  • 微信网站多少钱如何联系百度平台客服