宝塔面板执行Django任务

我们执行可以使用django-apscheduler 来执行定时任务但是有时候不稳定,如果您的服务器上安装了宝塔面板,那么我们可以通过宝塔面板来执行定时任务,设置步骤如下:

一、创建manage自定义命令

应用程序可以用 manage.py 注册自己的动作。例如,你可能想为你正在分发的 Django 应用添加一个 manage.py 动作 要做到这一点,将一个 management/commands 目录添加到应用程序中。Django 将为该目录中名称不以下划线开头的每个 Python 模块注册一个 manage.py 命令。例如:

polls/
    __init__.py
    models.py
    management/
        __init__.py
        commands/
            __init__.py
            _private.py
            closepoll.py
    tests.py
    views.py

在这个例子中,closepoll 命令将提供给任何在 INSTALLED_APPS 中包含 polls 应用程序的项目。

_private.py 模块将不会作为管理命令使用。

closepoll.py 模块只有一个要求——必须定义 Command 类,该类继承自 BaseCommand 或其 子类。 要实现该命令,请编辑 polls/management/commands/closepoll.py 如下:

from django.core.management.base import BaseCommand, CommandError
from polls.models import Question as Poll


class Command(BaseCommand):
    help = "Closes the specified poll for voting"

    def add_arguments(self, parser):
        parser.add_argument("poll_ids", nargs="+", type=int)

    def handle(self, *args, **options):
        for poll_id in options["poll_ids"]:
            try:
                poll = Poll.objects.get(pk=poll_id)
            except Poll.DoesNotExist:
                raise CommandError('Poll "%s" does not exist' % poll_id)

            poll.opened = False
            poll.save()

            self.stdout.write(
                self.style.SUCCESS('Successfully closed poll "%s"' % poll_id)
            )

当你使用管理命令并希望提供控制台输出时,你需要 write 至 self.stdout 和 self.stderr,而不是直接 print 至 stdout 和 stderr。利用这些代理,测试自定义命令会更方便。还需要注意的是,你不需要用换行符来结束消息,它会自动添加,除非你指定了 ending 参数 self.stdout.write("Unterminated line", ending="")

这个新的自定义命令能用 python manage.py closepoll <poll_ids>调用。

二、设置定时任务

在宝塔面板的定时任务添加一个脚本任务,脚本内容为:

#!/bin/bash

# 进入你的Django项目目录
cd /www/wwwroot/you_project

# 激活虚拟环境(如果你使用了虚拟环境)
source ~/webenv/bin/activate

# 运行Django管理命令,替换your_command为你需要执行的命令
python manage.py you_command

这样就可以执行django任务了

文档信息

版权声明:可自由转载(请注明转载出处)-非商用-非衍生

发表时间:2024年9月11日 16:58