Django Signal 代码布局
2024-09-28 01:04:20
需要确保信号注册函数在使用前就被引入,所以理论上你可以将其置于满足上述条件的任意位置。
官方推荐
将信号处理器定义在关联 app 目录下的 signals.py
中,在关联 app 的 apps.AppConfig
下的 ready() 中使用注册函数或者引入带 @receiver
装饰器的处理器。
示例如下(strategy 是一个 app 名称):
strategy/signals.py
:
def create_orders(sender, **kwargs):
pass
@receiver(post_save)
def decorated_handler(sender, **kwargs):
pass
strategy/apps.py
:
from django.apps import AppConfig
from django.db.models.signals import post_save
from strategy.signals import create_orders
from strategy.models import Strategy
class StrategyConfig(AppConfig):
name = 'strategy'
def ready(self):
# 注册
post_save.connect(create_orders, sender=Strategy)
# 或者引入带 `@receiver` 装饰器的处理器
from strategy.signals import decorated_handler
通过 connect
注册更好。原因是 from strategy.signals import decorated_handler
会被 IDE 提示为引入而未使用。
注意
- 要在
ready()
内部而不能是外部引入其他的 model,否则会报错:django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
,原因是只有在ready()
中, 其他 model 才已经被定义好了 - INSTALLED_APPS 中的 app 应该指向对应的 AppConfig 路径,只有这样 Django 才会调用对应 app 的 AppConfig 否则只是调用 AppConfig 基类:
default_app_config allows applications that predate Django 1.7 such as django.contrib.admin to opt-in to AppConfig features without requiring users to update their INSTALLED_APPS.
New applications should avoid default_app_config. Instead they should require the dotted path to the appropriate AppConfig subclass to be configured explicitly in INSTALLED_APPS.[1]
放在 models.py
中
上面的放置方式与 models.py
的关联强度不够,所以这里将其放到 models.py
中。具体操作是:
- 将信号处理器以
classmethod
的方式定义在对应的 model 中- 在 models.py 的最下方统一注册[2]
参考
- https://docs.djangoproject.com/en/2.0/ref/applications/#configuring-applications
- https://stackoverflow.com/a/2719664/5238892
最新文章
- jQuery的加法运算.
- java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),
- nodejs系列(二)REPL交互解释 事件循环
- 161027、Java 中的 12 大要素及其他因素
- memcached增删改查
- swift把汉字转换为拼音,并且截取首字母做索引用
- GDB调试技巧
- 6T GPT 移动硬盘在linux下的挂载
- android开发时间和日期的代码实现工具类(一)
- SQLserver查询数据类型为ntext是空或NULL值的方法
- MyEclipse 中 添加 js自动完成模版
- Zookeeper 快速入门(上)
- 使用docker redis-cluster集群搭建
- ul ol li的序号编号样式
- ssh和scp时指定端口
- easyui dialog 表单提交,弹框初始化赋值,dialog实现
- mysql 多表查询先排序,然后再取分组<;mysql 先order by,然后再取group by分组>;
- vue控制台报错
- Unity3D笔记 英保通九 创建数
- 【环境搭建】CDH版Hadoop环境搭建
热门文章
- python 去掉字符串的 ";
- js setInterval()函数 [倒计时用]
- 电脑不识别USB blaster驱动问题
- C#实现的自定义IIS认证模块 转载
- 使用GitHub做个人博客
- Tomcat 学习进阶历程之Tomcat架构与核心类分析
- C++语言基础(24)-四种类型转换运算符(static_cast、dynamic_cast、const_cast和reinterpret_cast)
- 李洪强iOS开发之iOS工具收集
- Vim 学习笔记二
- ubox及日志管理