Django独立运行在cron中

0 投票
1 回答
1309 浏览
提问于 2025-04-16 01:47

我想在我的定时任务(crontab)中运行一个自动发送新闻邮件的功能,但无论我怎么尝试,都无法让它正常工作。请问正确的方法是什么呢?

0 */2 * * * PYTHONPATH=/home/muntu/rails python2.6 /home/muntu/rails/project/newsletter.py

这是我的定时任务设置:

#! /usr/bin/env python
import sys
import os

os.environ["DJANGO_SETTINGS_MODULE"] = "project.settings"
from django.core.management import setup_environ
from project import settings
setup_environ(settings)

from django.template.loader import get_template, render_to_string
from django.template import Context
from django.core.mail import EmailMultiAlternatives
from django.utils.translation import ugettext_lazy as _
from django.core.mail import send_mail
from django.conf import settings
from project.utilsFD.models import *
from django.http import HttpResponse, HttpResponseRedirect, Http404

def main(argv=None):
    if argv is None:
        argv = sys.argv

    template_html = 'static/newsletter.html'
    template_text = 'static/newsletter.txt'
    newsletters = Newsletter.objects.filter(sent=False)
    adr = NewsletterEmails.objects.all()
    for a in adr:
        for n in newsletters:
            to = a.email          
            from_email = settings.DEFAULT_FROM_EMAIL           
            subject = _(u"Newsletter - Method #1")

            text_content = render_to_string(template_text, {"title": n.title,"text": n.text, 'date': n.data, 'email': to})
            html_content = render_to_string(template_html, {"title": n.title,"text": n.text, 'date': n.data, 'email': to})

            msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
            msg.attach_alternative(html_content, "text/html")
            msg.content_subtype = "html"
            msg.send()
            n.sent = True
            n.save()

if __name__ == '__main__':
    main()

还有这个newsletter.py文件,它位于我django项目的顶层文件夹:

#! /usr/bin/env python
import sys
import os

os.environ["DJANGO_SETTINGS_MODULE"] = "project.settings"
from django.core.management import setup_environ
from project import settings
setup_environ(settings)

from django.template.loader import get_template, render_to_string
from django.template import Context
from django.core.mail import EmailMultiAlternatives
from django.utils.translation import ugettext_lazy as _
from django.core.mail import send_mail
from django.conf import settings
from project.utilsFD.models import *
from django.http import HttpResponse, HttpResponseRedirect, Http404

def main(argv=None):
    if argv is None:
        argv = sys.argv

    template_html = 'static/newsletter.html'
    template_text = 'static/newsletter.txt'
    newsletters = Newsletter.objects.filter(sent=False)
    adr = NewsletterEmails.objects.all()
    for a in adr:
        for n in newsletters:
            to = a.email          
            from_email = settings.DEFAULT_FROM_EMAIL           
            subject = _(u"Newsletter - Method #1")

            text_content = render_to_string(template_text, {"title": n.title,"text": n.text, 'date': n.data, 'email': to})
            html_content = render_to_string(template_html, {"title": n.title,"text": n.text, 'date': n.data, 'email': to})

            msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
            msg.attach_alternative(html_content, "text/html")
            msg.content_subtype = "html"
            msg.send()
            n.sent = True
            n.save()

if __name__ == '__main__':
    main()

我哪里做错了呢?这个功能在作为django应用运行时没有任何问题,但当我尝试从控制台运行时,它给了我:

Traceback (most recent call last):
  File "newsletter.py", line 7, in <module>
    from project import settings
ImportError: No module named project

而且它在定时任务中根本不工作。

1 个回答

1

试着把你的定时任务(cron)设置改成这样:

0 */2 * * * cd /home/muntu/rails && python2.6 /home/muntu/rails/project/newsletter.py

这样可以确保“rails”这个文件夹在Python的搜索路径里。如果你想设置PYTHONPATH,可以创建一个脚本:

#!/bin/sh
export PYTHONPATH=/home/muntu/rails
python2.6 /home/muntu/rails/project/newsletter.py

然后把这个脚本放到定时任务里。

撰写回答