2024-09-30 22:14:35 发布
网友
我想开发一个应用程序来监视数据库中的新记录,并允许我在插入新记录时在Django应用程序的上下文中执行一个方法。在
我计划使用一种方法,在这种方法中,芹菜任务检查数据库中自上次检查以来的更改,并触发上述方法。在
有没有更好的方法来实现这一点?在
我使用SQLite作为后端,并尝试了apsw的setupdatehook API,但它似乎没有在Django上下文中运行我的模块。在
注意:这些更新是由Django外部的另一个应用程序进行的。在
更好的方法是让修改记录的应用程序调用您的。或者至少创建一个芹菜队列条目,这样您就不必经常查询数据库来查看是否发生了变化。在
但是如果这不是一个选择,那么让celery查询数据库以确定是否发生了变化可能是下一个最佳选择。(当然比从数据库调用web服务作为触发器的另一个可能的选项要好,您应该真正避免这一点。)
创建一个芹菜任务来执行您需要对对象执行的任何操作:
任务.py
from celery.decorators import task @task() def foo(object): object.do_some_calculation()
然后创建一个django signal,每次保存模型的实例时都会激发该实例,将任务放入芹菜中排队:
模型.py
需要注意的是,django的信号是同步的,换句话说,queue_task函数在请求周期内运行,但是queue_task函数所做的就是告诉Celery在B后台处理实际的工作内容(do_some_calculation)
queue_task
do_some_calculation
更好的方法是让修改记录的应用程序调用您的。或者至少创建一个芹菜队列条目,这样您就不必经常查询数据库来查看是否发生了变化。在
但是如果这不是一个选择,那么让celery查询数据库以确定是否发生了变化可能是下一个最佳选择。(当然比从数据库调用web服务作为触发器的另一个可能的选项要好,您应该真正避免这一点。)
创建一个芹菜任务来执行您需要对对象执行的任何操作:
任务.py
然后创建一个django signal,每次保存模型的实例时都会激发该实例,将任务放入芹菜中排队:
模型.py
^{pr2}$需要注意的是,django的信号是同步的,换句话说,
queue_task
函数在请求周期内运行,但是queue_task
函数所做的就是告诉Celery在B后台处理实际的工作内容(do_some_calculation
)相关问题 更多 >
编程相关推荐