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

时间:2018-08-24 07:09:31

标签: python django background-task

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

@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

但是我面临两个问题:

  1. 当从模板中单击按钮时,类型为“ WSGIRequest”的对象不是JSON可序列化错误!

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

波纹管是我的模板:

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

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

提前感谢

2 个答案:

答案 0 :(得分:0)

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

该脚本应具有逻辑,可以完成哪些图像,哪些图像处于待处理状态或哪些图像正在处理中。

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

答案 1 :(得分:0)

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