一个芹菜任务类,其执行被延迟到请求完成之后
django-post-request-task的Python项目详细描述
一个芹菜3.x任务类,其执行被延迟到请求之后 使用来自django的request_started和request_finished信号完成 和线程局部变量。
如果您的视图包装在事务中(如果 您正在对它们进行数据库修改),因为您可能最终触发 在交易被提交(甚至触发)之前太快完成芹菜任务 回滚相应事务时的任务)。
通过监听request_started和request_finished的django信号,我们 可以在从@atomic创建的所有事务之后安全地触发任务,或者 ATOMIC_REQUESTS已提交。
用法
fromceleryimportCeleryfrompost_request_task.taskimportPostRequestTaskapp=Celery('myapp',task_cls=PostRequestTask)@app.taskdefmy_task():# If .delay() is called on this task inside a django request-response# cycle it will be called once the request is finished, and not before.pass
或者,如果您直接使用任务装饰器:
frompost_request_task.taskimporttask@taskdefmy_task():pass
就这样。如果任务是从django请求响应外部调用的 循环,则正常触发。
作为一个额外的特性,如果用相同的参数调用同一个任务,那么 在请求-响应周期中,它将只排队一次。
运行测试
$ make testenv
$ make test
默认情况下,无论安装了什么django版本,都会运行测试。如果要对其他版本运行测试 使用毒性:
$ make testenv $ tox -e 2.7-1.11.x # or any other environment defined in our tox.ini