django数据库信号(提交前/提交后/回滚)。
django-db-signals的Python项目详细描述
此应用程序向Django的某些数据库操作添加一组信号:
- django.db.signals.pre_commit
- django.db.signals.post_commit
- django.db.signals.pre_rollback
- django.db.signals.post_rollback
- django.db.signals.pre_transaction_management
- django.db.signals.post_transaction_management
要求
- python 2.6/2.7/3.2/3.3(3.x需要django>;=1.5)
- Django 1.2/1.3/1.4/1.5
安装
从pypi安装:pip install django-db-signals。
将'django_db_signals'添加到INSTALLED_APPS。
通过添加到models.py:
importdjango_db_signalsdjango_db_signals.enable()
示例
假设您已经安装了django db信号,现在您需要记录 每次回滚数据库时都会显示消息:
fromdjango.dbimportsignalsfromdjango.dispatchimportreceiverimportlogginglogger=logging.getLogger(__name__)@reciever(signals.post_rollback)deflog_rollbacks(sender,**kwargs):# sender is a DatabaseWrapper objectlogger.info("A rollback occurred on database %s"%sender.alias)
设计
与django设置通过^{tt11}可用的方式相同$ 属性,信号可通过django.db.signals属性获得。作为 这样,尝试导入单个信号将失败:
>>>importdjango_db_signals>>>django_db_signals.enable()>>>fromdjango.dbimportsignals# GOOD>>>signals.pre_commit<django.dispatch.dispatcher.Signalobjectat0x1089c8b90>>>>fromdjango.db.signalsimportpre_commit# BADTraceback(mostrecentcalllast):File"<stdin>",line1,in<module>ImportError:Nomodulenamedsignals
pre_…vspost_…signals
pre_…在操作发生之前发送信号。信号被发送 通过.send(…)。接收器中引发的异常将传播到 申请。利用此漏洞可以取消操作(例如阻止 提交)。
post_…信号在操作后发送,因此无法提供 同样的取消挂起的操作行为。信号通过 .send_robust(…)以确保调用所有接收器。提出的任何异常 记录,但不传播到应用程序。
记录
名为django.db.signals的记录器用于记录 post_…接收者。
信号发送器
对于所有数据库信号,信号的发送者是django的数据库 连接包装。
故障排除
“I can import ^{tt12}$, but when I try to access a signal I get an ^{tt22}$ exception.”
您需要通过django_db_signals.enable()
启用信号