使用crontab与django配合使用

12 浏览
0 Comments

使用crontab与django配合使用

这个问题已经有了答案

如何设置计划任务?

我需要创建一个功能,每天从 crontab 发送通讯。我在互联网上找到了两种方法:

首先,将文件放置在 django 项目文件夹中:

#! /usr/bin/env python
import sys
import os
from django.core.management import setup_environ
import settings
setup_environ(settings)
from django.core.mail import send_mail
from project.newsletter.models import Newsletter, Address
def main(argv=None):
    if argv is None:
        argv = sys.argv
    newsletters = Newsletter.objects.filter(sent=False)
    message = 'Your newsletter.'
    adr = Address.objects.all()
    for a in adr:
        for n in newsletters:
            send_mail('System report',message, a ,['user@example.com'])
if __name__ == '__main__':
    main()

我不确定它是否起作用,也不确定如何运行它。假设它叫做 run.py,那么我应该在 cron 中用 0 0 * * * python /path/to/project/run.py调用它吗?

第二种解决方案是,创建我的 send 函数(就像普通的 django 函数一样)并创建 run.py 脚本:

import sys
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
module_name = sys.argv[1]
function_name = ' '.join(sys.argv[2:])
exec('import %s' % module_name)
exec('%s.%s' % (module_name, function_name))

然后在 cron 中调用:0 0 * * * python /path/to/project/run.py newsletter.views daily_job()

哪种方法可以工作,或者哪种更好?

admin 更改状态以发布 2023年5月21日
0
0 Comments

Ashok的建议是通过计划任务运行管理命令,这很有效,但如果你要寻求更加稳健的解决方案,我会推荐你看看Kronos这样的库:

# app/cron.py
import kronos
@kronos.register('0 * * * *')
def task():
    pass

0
0 Comments

我建议将您的功能创建为 Django管理命令并通过crontab运行。

如果您的命令是send_newsletter,那么只需

0 0 * * * python /path/to/project/manage.py send_newsletter

在这种情况下,您不需要设置设置模块。

0