如何使用 Django admin 使用 Celery 创建自定义任务
Posted
技术标签:
【中文标题】如何使用 Django admin 使用 Celery 创建自定义任务【英文标题】:How to use Django admin to create custom tasks using Celery 【发布时间】:2021-06-04 22:15:21 【问题描述】:我有一个为房地产公司创建的 Django 后端。我已经构建了很多硬编码的任务,我想通过管理页面自定义这些任务......但我无法弄清楚如何做到这一点。
例如,假设我想创建一个任务来发送可以从管理页面自定义的电子邮件。理想情况下,我会有一个可供选择的触发器列表,例如提交联系表单。
看起来像这样的东西:
【问题讨论】:
不清楚。你想知道如何制作像 Celery 这样的东西吗?还是想自定义 Admin? 我猜都不是。我想使用 celery 通过管理员进行相关的可定制任务。 你不清楚哪一部分?您可以在管理员中创建一个自定义表单来触发一些 Celery 任务。 @Ryan Django 允许用户创建自定义表单。使用这些表单,当表单提交时,您可以有自定义的保存方法,可以根据输入触发相关任务。 我知道这不是我要说的。 【参考方案1】:我多次遇到同样的需求,解决方法如下:
-
我有一个抽象的“基础”任务模型,其中包含任何“通用”后台任务共有的几个字段:created_on、started_on、completed_on、status、progress、failure_reason 等等
当需要新的特定任务时,我会写:
由调度程序运行的作业功能(在您的情况下为 Celery)
从 Task 派生的具体模型
派生模型知道必须运行哪个作业;这是在模型定义中硬编码的; 我还添加了特定字段来收集作业所需的任何自定义参数
现在,您可以通过编程方式或从 Django 管理员创建新任务,并根据需要提供实际参数;在后一种情况下,Django 照常提供所需的表单和验证
在数据库中保存新记录后,模型开始工作,传递任务(模型)id; 您可以从作业中检索任务的详细信息:这是原始问题的答案。 您还可以更新模型中的进度/状态以供以后检查,并使用基类提供的其他服务(例如日志记录)。
此架构已被证明非常有用,因为作为额外的好处,您可以从 Django 管理员监控异步任务。
在多个项目中使用过它,我将这个逻辑封装在一个可重用的 Django 应用程序中:
https://github.com/morlandi/django-task
当前的实现基于rq
,因为Celery
针对我的需要进行了过度设计。我想它可以通过一些修改适应Celery
:
此外,辅助作业类必须重构如下:
将 rq.get_current_job() 替换为 Celery 的等效项很遗憾,最近没用过Celery,无法给出更详细的建议。
【讨论】:
这在概念上是我正在寻找的,但我正在查看代码,我不太明白如何将 rq 集成与 celery 交换 嗯,我明白了......当我写“它可以适应Celery,只需少量修改”时,我就过于乐观了;我为此道歉。我会改变我的答案以更好地反映这一点以上是关于如何使用 Django admin 使用 Celery 创建自定义任务的主要内容,如果未能解决你的问题,请参考以下文章
如何将 django-admin-bootstrapped 与 django 1.10 集成
Django Admin Cookbook-8如何在Django admin中优化查询
Django Admin Cookbook-39如何两次向Django管理员添加模型