热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

详解Django中观察者模式

Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。
Django中提供了“信号调度”,用于在框架执行操作时解耦。通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒一些接受者。

Django提供一种信号机制。其实就是观察者模式,又叫发布-订阅(Publish/Subscribe) 。当发生一些动作的时候,发出信号,然后监听了这个信号的函数就会执行。

Django内置了一些信号,比如:


django.db.models.signals.pre_save 在某个Model保存之前调用
django.db.models.signals.post_save 在某个Model保存之后调用
django.db.models.signals.pre_delete 在某个Model删除之前调用
django.db.models.signals.post_delete 在某个Model删除之后调用
django.core.signals.request_started 在建立Http请求时发送
django.core.signals.request_finished 在关闭Http请求时发送

我们要做的,就是注册一个receiver函数。例如,如果要在每次请求完成之后,打印一行字。

可以使用回调的方式注册:


# receiver
def my_callback(sender, **kwargs):
  print("Request finished!")
 
# connect
from django.core.signalsimport request_finished
 
request_finished.connect(my_callback)

也可以使用装饰器的方式注册,下面这段代码和上面完全是等价的。


from django.core.signalsimport request_finished
from django.dispatchimport receiver
 
@receiver(request_finished)
def my_callback(sender, **kwargs):
  print("Request finished!")

receiver回调函数除了可以使用sender之外,还可以使用其他一些参数,比如针对pre_save函数:

sender:发送者(如果是pre_save的话,就是model class)
instance:实例
raw
using
update_fields
post_save()是一个比较实用函数,可以支持一些联动的更新。而不必让我们每次都写在view里面。比如:有用户提交了退款申请,我们需要把订单的状态修改成“已退款”的状态。就可以使用信号机制,而不必在每处都修改。


@receiver(post_save, sender=RefundForm)
deforder_state_update(sender, instance, created, **kwargs):
  instance.order.state = REFUNDING
  instance.order.save() # 这里,order是refundform的一个外键

当然,这里可以写的更多更周全,例如退款单取消改回状态等。

观察者是非常实用的一个设计模式,Django也支持用户 自定义 一些信号。


推荐阅读
  • 本文深入解析了Django框架中的MVT(Model-View-Template)设计模式,详细阐述了其工作原理和应用流程。通过分析URL模式、视图、模型和模板等关键组件,读者将全面理解Django应用程序的架构体系,掌握如何高效地构建和管理Web应用。 ... [详细]
  • 在Django中提交表单时遇到值错误问题如何解决?
    在Django项目中,当用户提交包含多个选择目标的表单时,可能会遇到值错误问题。本文将探讨如何通过优化表单处理逻辑和验证机制来有效解决这一问题,确保表单数据的准确性和完整性。 ... [详细]
  • 深入解析 Django 中用户模型的自定义方法与技巧 ... [详细]
  • 如何在Django和Vue中配置共享全局变量以实现跨组件数据传递
    在Django和Vue项目中,为了实现跨组件的数据传递,可以通过配置共享全局变量来达到目的。具体做法是在Django项目的主目录下创建一个专门用于存储全局变量的Python文件。例如,可以在该文件中定义一个函数 `templates_global`,该函数返回需要在多个组件间共享的数据。此外,还可以利用Vue的Vuex状态管理库来进一步增强数据的管理和传递效率,确保数据的一致性和可维护性。 ... [详细]
  • 在生产环境中进行高效部署与优化 ... [详细]
  • Django框架下的对象关系映射(ORM)详解
    在Django框架中,对象关系映射(ORM)技术是解决面向对象编程与关系型数据库之间不兼容问题的关键工具。通过将数据库表结构映射到Python类,ORM使得开发者能够以面向对象的方式操作数据库,从而简化了数据访问和管理的复杂性。这种技术不仅提高了代码的可读性和可维护性,还增强了应用程序的灵活性和扩展性。 ... [详细]
  • Django新手指南:第三步——构建你的首个项目
    在本教程中,我们将引导你完成创建第一个Django应用的步骤。通过实际操作,你将逐步了解Django框架的核心概念和基本功能。从项目结构到视图和模板的实现,我们将详细介绍每个环节,帮助你快速上手并构建出一个功能完整的Web应用。 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
  • Django 模型字段参数详解:全面解析与应用实例 200315
    在 Django 模型中,字段参数的设置对于数据完整性和应用逻辑至关重要。本文详细解析了各个字段参数的含义及其应用场景,包括 `null`(默认为 `False`,表示数据库中不允许该字段为空)、`blank`(控制表单验证时是否允许为空)、`db_column`(自定义数据库列名)、`default`(设置默认值)和 `primary_key`(指定主键)。通过具体示例,帮助读者更好地理解和应用这些参数。 ... [详细]
  • Python作为一门高级编程语言,在全球脚本语言排名中长期位居前列,广泛应用于多个领域。当前,Python开发人才市场需求旺盛,而专业人才供给相对不足,这使得相关培训课程备受关注。本课程旨在全面培养Python技能,满足行业需求。 ... [详细]
  • Django项目中配置媒体文件路径的详细步骤与最佳实践
    在Django项目中配置媒体文件路径的详细步骤包括:首先,创建一个新的应用(如 `app02`),然后在 `settings.py` 文件中配置媒体文件的存储路径。具体来说,需要导入 `os` 模块,并使用 `os.path.join` 方法来指定媒体文件的保存目录。此外,建议在开发和生产环境中分别设置不同的媒体文件路径,以确保项目的灵活性和安全性。为了更好地管理和访问媒体文件,还可以在 `urls.py` 中添加相应的URL配置,以便在开发服务器上直接访问这些文件。 ... [详细]
  • 本文深入分析了Django框架中模型应用与非模型应用的区别与应用场景,详细对比了两者在数据处理、性能表现及开发灵活性等方面的特点。同时,文章还介绍了如何在视图函数中有效利用这些特性,结合PostgreSQL、MySQL、SQLite3和Oracle等不同数据库的配置与使用方法,为开发者提供了全面的参考指南。 ... [详细]
  • 使用 requests.post 方法向 URL 上传 JSON 数据时遇到连接被拒绝错误 ... [详细]
  • 优化Django应用中的MySQL连接池配置方法
    django设置mysql连接池 导库 pipinstalldjango-db-connection-poolsettings.py设置 将ENGINEdjango.db.back ... [详细]
  • 中间件的概念中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实 ... [详细]
author-avatar
Chen.X.Jie
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有