没有Celery的Django定时任务?

2 投票
1 回答
3942 浏览
提问于 2025-04-18 09:56

在我的应用程序中,用户有一些积分(也可以叫做信用点),这些积分和他们的月度订阅有关。

我想要在每个月的特定日期,自动为每个用户补充积分。需要注意的是,每个用户的这个日期是不一样的,具体取决于他们订阅的日期。

我听说过Celery可以用来处理定时任务,听起来可以满足我的需求,但可能有点复杂。有没有更简单的办法(也许是Django自带的)来实现这个呢?

1 个回答

4

你可以创建一个服务,用来检查你的记录,并执行你需要的操作。

下面是一个简单的例子,文件放在项目的根目录下,结构大概是这样的:

  • manage.py
  • my_service.py
  • project_name

那么,my_service.py 的源代码可能是:

#!/usr/bin/env python
import os
import sys
import time
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project_name.settings")

form django.contrib.auth.models import User
while True:
    rows = User.objects.filter(created___startswith=...)
    if not rows:
        print 'sleep...'
        time.sleep(10)
        continue
    [you actions should be here]

然后你可以通过命令 python my_service.py 在后台运行它。

或者你可以把这个脚本添加到定时任务中(如果这样做的话,这部分需要修改):

注意:如果你想把它添加到定时任务中,你需要把 while True 改成一个有限的循环,比如这样:

form django.contrib.auth.models import User
rows = User.objects.filter(created___startswith=...)
if not rows:
    sys.exit(1)
while R in rows:
    [you actions should be here]

现在,如果你想让它每小时运行一次,可以查看一下这个链接,里面有很多相关的例子。

注意:这只是一个例子,你需要把模型的名字改成你自己模型的名字和查询。

撰写回答