使用crontab与django

cri*_*eos 11 python django cron crontab

我需要创建一个每天从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 Code Online (Sandbox Code Playgroud)

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

第二个解决方案 - 在任何地方创建我的发送函数(就像普通的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))
Run Code Online (Sandbox Code Playgroud)

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

哪种方法有效,哪种更好?

Ash*_*hok 34

我建议您创建django-management-command的功能,并通过crontab运行它

如果你的命令send_newsletter那么简单

0 0 * * * python /path/to/project/manage.py send_newsletter
Run Code Online (Sandbox Code Playgroud)

在这种情况下你不需要设置设置模块/

  • 我发现了问题:使用sqlite3数据库时,必须在DATABASE设置中指定数据库的完整路径 (3认同)

Joh*_*set 10

Ashok关于通过cron运行管理命令的建议很有效,但是如果你正在寻找一些更强大的东西,我会调查像Kronos这样的库:

# app/cron.py

import kronos

@kronos.register('0 * * * *')
def task():
    pass
Run Code Online (Sandbox Code Playgroud)


Mik*_*one 1

我推荐选项 3:使用django-extensions中的作业系统。相关的扩展命令有:

\n\n
    \n
  • create_jobs\xe2\x80\x93 在当前目录中为给定应用程序名称创建 Django jobs 命令目录结构。这是令人印象深刻的就业系统的一部分。
  • \n
  • runjob\xe2\x80\x93 运行单个维护作业。就业系统的一部分。
  • \n
  • runjobs\xe2\x80\x93 运行计划的维护作业。指定每小时、每天、每周、每月。就业系统的一部分。
  • \n
\n\n

这使您可以管理 Django 内部的所有作业处理,因此您不必继续搞乱 crontab。

\n