2010-07-25 7 views
0

Je veux exécuter la fonction de bulletin automatique dans ma crontab, mais peu importe ce que j'essaie - je ne peux pas le faire fonctionner. Quelle est la méthode appropriée pour faire cela? Ceci est mon entrée crontab:Django autonome exécuté dans cron

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

Et le fichier newsletter.py, qui est situé dans le dossier haut de mon projet 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() 

Qu'est-ce que je fais mal? La fonction elle-même fonctionnait sans aucun problème lorsqu'il est exécuté comme application django, mais quand je tente de l'exécuter à partir de la console, il m'a donné:

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

Et ça ne marche pas du tout de Cron.

+1

Est-ce que '/ home/muntu/rails/projet/__ init __ .py' existe? – unutbu

+0

avez-vous un fichier '__init __. Py' dans le dossier' project'? –

+0

bien sûr. Je suppose qu'il n'y a aucun moyen qu'un projet Django fonctionne sans lui :) – muntu

Répondre

1

Essayez de changer l'entrée cron pour:

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

Cela garantira que le répertoire "rails" est dans le chemin de python. Si vous souhaitez définir le PYTHONPATH, puis créez un script shell:

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

et mettre le script shell dans l'entrée de Cron.

Questions connexes