如何只运行一次 Django 后台任务

Posted

技术标签:

【中文标题】如何只运行一次 Django 后台任务【英文标题】:How to run Django background task only once 【发布时间】:2018-08-24 07:09:31 【问题描述】:

我正在尝试在按钮单击时裁剪图像(数千张图像),下面是我的代码!

@background(schedule=5)
def initialize():

    allimages = []
    number = 0

    if not os.path.exists('thumbnails'):
        os.makedirs('thumbnails')

    path = '/Users/shoaibrafa/Data/*.jpg'

    for image in glob.glob(path):
        print(image,"=====",number)
        im = Image.open(image)
        im.thumbnail((512, 512), Image.ANTIALIAS)
        im.save("thumbnails/" + os.path.basename(image), "JPEG")
        number = number + 1

但我面临两个问题:

    单击模板中的按钮时,会出现“WSGIRequest”类型的 Object is not JSON serializable 错误!

    如果我在页面加载时直接调用方法 initialize(),则后台任务开始裁剪图像,但是当所有图像都被裁剪时,它会从开始裁剪图像重新开始并永远持续下去。我需要的是裁剪图像并结束后台任务。

下面是我的模板:

% extends 'layout.html' %
% block title % Login % endblock %

% block content %
    <a class="btn btn-primary" href="% url 'home:init'%">Initialize...</a>
% endblock %

提前致谢

【问题讨论】:

initialize 应该返回 http 响应是否可以将 bool 字段添加到 Image 模型? 该错误与您在此处发布的任何代码无关。响应按钮单击并将此任务排入队列的请求在哪里?无论如何,您使用的是什么“背景”库? Django + background-tasks how to initialize的可能重复 【参考方案1】:

使用 Django 后台任务,您可以在创建任务之前检查它是否已经存在,这样您就不会创建重复项

from background_task.models import Task
if not Task.objects.filter(verbose_name="my_task_name").exists():
   tasks.my_task(verbose_name="my_task_name")

我在这里解释了如何通过检查任务是否已经创建来只运行一次任务: Django + background-tasks how to initialize

【讨论】:

不要发布仅链接到另一个答案的答案,而是将flag the question作为副本发布。 好吧抱歉,我对 *** 有点陌生(至少是活跃的,而不仅仅是搜索),当我看到它们是重复的内容时,我将从现在开始标记内容【参考方案2】:

为什么不编写一个命令行脚本/工具——您可以使用 cron 作业来运行它?

脚本应该具有逻辑,哪些图像已完成,哪些图像正在等待处理或哪些正在裁剪。

May - 让 Django 显示此脚本的状态:正在运行、正在睡眠、已完成工作等。

【讨论】:

以上是关于如何只运行一次 Django 后台任务的主要内容,如果未能解决你的问题,请参考以下文章

Django后台任务

Django 后台任务间隔

如何在基于servlet的Web应用程序中运行后台任务?

Django后台任务等待结果

使用 Django 启动和停止定期后台任务

在不运行应用程序的情况下注册后台任务