如何只运行一次 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 后台任务的主要内容,如果未能解决你的问题,请参考以下文章