如何使用 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

移除 Task.check_worker_active_for_queue() 移除 Task.get_queue() 重构Task.run()

此外,辅助作业类必须重构如下:

将 rq.get_current_job() 替换为 Celery 的等效项

很遗憾,最近没用过Celery,无法给出更详细的建议。

【讨论】:

这在概念上是我正在寻找的,但我正在查看代码,我不太明白如何将 rq 集成与 celery 交换 嗯,我明白了......当我写“它可以适应Celery,只需少量修改”时,我就过于乐观了;我为此道歉。我会改变我的答案以更好地反映这一点

以上是关于如何使用 Django admin 使用 Celery 创建自定义任务的主要内容,如果未能解决你的问题,请参考以下文章

如何将 django-admin-bootstrapped 与 django 1.10 集成

如何在外键 django admin 中使用详细名称?

Django Admin Cookbook-8如何在Django admin中优化查询

Django Admin Cookbook-39如何两次向Django管理员添加模型

如何使用 Django admin 使用 Celery 创建自定义任务

如何在使用 django admin 将记录插入数据库后添加功能?