ubuntu
Windows&Linux下设置ngrok开机自启动
Deno 1.0
解决:关于docker闪退的问题
Windows 上的 Docker 引擎
文档管理 - 个人中心
Windows 10 安装 MySQL 8.0 指南
给Django添加Google Adsense 要求的ads.txt
docker命令
如何回滚WordPress插件(初学者版本控制) | ItBook
在Ubuntu 18.04上安装PHP 7.4
docker命令行
在PHP 7.3,Nginx,Apache,使用加密SSL,Cloud SQL(MySQL 5.7)的Google Cloud Platform上,将具有Nginx反向代理的WordPress安装到Ubuntu 18.04的Apache到Apache。
How to install mcrypt PHP module on Ubuntu 18.04 Linux
DjangoCMS手动安装
搭建Git服务器
Ubuntu Server 18.04 LTS 开机自动启动脚本 SVN自动启动 rc.local
通过禁用信号进行更快的DJANGO测试
gitBook的发布流程
ubuntu 18.04 怎么设置字体样式,调整字体大小
iptables过滤URL目标请求的小技巧
rsync复制文件的一些注意事项
如何设置crontab的时区?
本文档使用 MrDoc 发布
-
+
首页
通过禁用信号进行更快的DJANGO测试
Django信号是控制反转的一种形式,开发人员可以使用它来触发(通常)基于模型更新的更改。 典型示例是在创建User实例时自动创建UserProfile: ```python from django.conf import settings from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender=settings.AUTH_USER_MODEL) def post_save_receiver(sender, instance, created, **kwargs): UserProfile.objects.create(user=instance, ...) ``` 信号对于将您自己的行为连接到您可能无法控制的事件(例如由框架或库代码生成的事件)很有用。通常,如果有能力的话,您应该首选其他方法,例如覆盖模型保存方法,因为这样会使代码更容易推理。 信号接收器有时可能比创建单个对象复杂得多,并且任何给定事件都可能有许多接收器,这会使执行简单操作所需的时间倍增。 测试和信号 通常,在运行测试套件时,实际上并不需要执行信号,尤其是在创建和删除成千上万个模型实例的情况下。但是,断开信号比较棘手,尤其是在断开/重新连接逻辑可以堆叠的情况下。 挂起信号接收器的一种更简单但更具侵入性的方法是检查全局设置,并尽早返回。 ```python from django.conf import settings @receiver(post_save, sender=MyModel) def mymodel_post_save(sender, **kwargs): if settings.DEBUG: return work() ``` 这有两个缺点。首先,它很杂乱,您需要记住将支票添加到每个接收者。其次,它取决于您在运行测试时可能需要关闭的特定设置,这使得测试实际的接收器更加困难。 选择性禁用信号 我们可以采用检查设置的最新想法,并将其很好地包装在我们自己的装饰器中。运行测试时,可以覆盖SUSPEND_SIGNALS每个测试方法或类的设置。 这是一个要点 ```python import functools from django.conf import settings from django.dispatch import receiver def suspendingreceiver(signal, **decorator_kwargs): def our_wrapper(func): @receiver(signal, **decorator_kwargs) @functools.wraps(func) def fake_receiver(sender, **kwargs): if settings.SUSPEND_SIGNALS: return return func(sender, **kwargs) return fake_receiver return our_wrapper ``` 在测试套件中使用此装饰器非常简单: ```python @override_settings(SUSPEND_SIGNALS=True) class MyTestCase(TestCase): def test_method(self): Model.objects.create() # post_save_receiver won't execute @suspendingreceiver(post_save, sender=MyModel) def mymodel_post_save(sender, **kwargs): work() ``` 就像这样,我们可以根据需要跳过测试套件中的信号接收器!
老糊糊
2020年6月15日 17:43
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码