django

2010-07-08 4 views
10

के साथ crontab का उपयोग करके मुझे crontab से प्रतिदिन न्यूज़लेटर्स भेजने के लिए एक फ़ंक्शन बनाने की आवश्यकता है। फ़ाइल Django परियोजना फ़ोल्डर में रखा -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 ,['[email protected]']) 

if __name__ == '__main__': 
    main() 

मुझे यकीन है कि अगर यह काम करेगा नहीं कर रहा हूँ और मुझे यकीन है कि कैसे नहीं हूँ मैं इंटरनेट पर ऐसा करने के दो तरीके मिल गया है इसे चलाने के लिए। मान लें कि इसे run.py कहा जाता है, तो क्या मुझे इसे 0 0 * * * python /path/to/project/run.py के साथ क्रॉन में कॉल करना चाहिए?

दूसरा समाधान - एक run.py स्क्रिप्ट कहीं (सिर्फ एक सामान्य Django समारोह की तरह) मेरी भेजने समारोह बनाते हैं और फिर बनाने के लिए: क्रॉन कॉल में

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)) 

और फिर: 0 0 * * * python /path/to/project/run.py newsletter.views daily_job()

जो विधि काम करेगा, या कौन सा बेहतर होगा?

उत्तर

1

मैं विकल्प 3 की सिफारिश करता हूं: django-extensions में उपयोग करें। प्रासंगिक एक्सटेंशन कमांड हैं:

  • create_jobs - वर्तमान निर्देशिका में दिए गए ऐप नाम के लिए एक Django नौकरियां कमांड निर्देशिका संरचना बनाता है। यह प्रभावशाली नौकरियों प्रणाली का हिस्सा है।
  • runjob - एक ही रखरखाव नौकरी चलाएं। नौकरियां प्रणाली का हिस्सा।
  • runjobs - निर्धारित रखरखाव नौकरियां चलाता है। प्रति घंटा, दैनिक, साप्ताहिक, मासिक निर्दिष्ट करें। नौकरियां प्रणाली का हिस्सा।

इससे आपको Django के अंदर सभी नौकरी हैंडलिंग का प्रबंधन करने की सुविधा मिलती है, इसलिए आपको क्रोंटैब के साथ गड़बड़ नहीं करना पड़ेगा।

+0

ठीक है, लेकिन यह मेरे लिए की आवश्यकता है बहुत सारी चीज़ें इंस्टॉल करें जिन्हें मुझे वास्तव में आवश्यकता नहीं है। और अगर मैं सिर्फ यह काम करना चाहता हूं? – crivateos

+0

आप कभी भी इस Django परियोजना के साथ एक और crontab कार्य नहीं करेंगे? तब अशोक का जवाब सबसे अच्छा काम करेगा; manage.py को कष्टप्रद सेटअप का ख्याल रखना चाहिए। हालांकि मुझे नहीं लगता कि कैसे 'sudo easy_install django-extension' है "आपको जिस सामान की आवश्यकता नहीं है"। –

+0

मैं नौकरियों के ढांचे का प्रशंसक नहीं हूं - प्रबंधन आदेशों के साथ छड़ी सीधे या तो क्रोन के माध्यम से या डीजेंगो-क्रोनोग्रफ़ –

32

मैं django-management-command के रूप में अपने कार्यक्षमता बनाने का सुझाव देते हैं और crontab के माध्यम से इसे चलाने

अगर अपने आदेश send_newsletter तो बस

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

है और आप में सेटिंग्स मॉड्यूल स्थापित करने की देखभाल करने की जरूरत नहीं है जाएगा यह मामला/

+0

का उपयोग करके मैं कोशिश कर रहा हूं हालांकि यह आदेश डेटाबेस डेटाबेस के साथ विफल रहता है: ऐसी कोई तालिका नहीं। – Raphael

+2

मुझे समस्या मिली: एक sqlite3 डेटाबेस का उपयोग करते समय आपको डेटाबेस सेटिंग्स – Raphael

1

मैंने आपके पहले विकल्प के समान विधि का उपयोग करके कुछ कमांड लाइन अनुप्रयोग लिखे हैं। मैं DJANGO_SETTINGS_MODULE पर्यावरण चर का उपयोग करने के विरोध में इसे इस तरह से करना पसंद करता हूं क्योंकि यह एक नियमित पायथन प्रोग्राम (मेरे लिए) जैसा लगता है।

आपको यह भी ध्यान रखना चाहिए कि आपको अपने मॉड्यूल को उसी settings.py के समान निर्देशिका में रखना नहीं है; आप अपनी सेटिंग्स मॉड्यूल का पूर्ण पायथन पथ का उपयोग कर सकते हैं:

from django.core.management import setup_environ 
from project import settings 
setup_environ(settings) 
#The rest of your imports 

PEP 8 रिश्तेदार आयात वैसे भी हतोत्साहित करता है।

मैं हमेशा (Gentoo पर /usr/lib64/python2.6/site-packages) साइट-संकुल में मेरी Django अनुप्रयोग स्थापित इसलिए मैं अपने crontabs से PYTHONPATH स्थापना के बारे में चिंता करने की ज़रूरत नहीं है, लेकिन मैं नहीं मानता कि एक व्यापक रूप से प्रचलित तरीका है। मैं setuptools Automatic Script Creation का उपयोग करना भी पसंद करता हूं ताकि मेरी कंसोल स्क्रिप्ट्स जहां भी होनी चाहिए (/usr/bin, उदाहरण के लिए) और उचित रूप से नामित हैं। आपका पहला विकल्प यह भी सुविधा प्रदान करता है।

0

विकल्प 1 मेरे लिए काम करता है। मेरे पास आमतौर पर प्रोजेक्ट निर्देशिका में स्क्रिप्ट सीडी है और फिर "पायथन ./script_name.py" करें ताकि कोई रहस्यमय पथ समस्या न हो ... आलसी, लेकिन यह लगातार काम करता है।

1

django-cron भी है। इसका उपयोग करना बहुत आसान है, इंस्टॉल या सेट अप करने के लिए और कुछ नहीं है।

हालांकि, मैं कैसे यह वास्तव में काम करता है के बारे में निश्चित नहीं हूँ ... मेरा मतलब है मैं नहीं जानता कि कैसे नौकरियों और चलाए जा रहे हैं वे सब पर चलाए जा रहे हैं, तो जब कोई भी साइट के लिए एक अनुरोध करता है । लेकिन आप कोशिश कर सकते हैं!

+2

पर डेटाबेस के लिए पूरा पथ निर्दिष्ट करना होगा django-cron को लंबे समय तक अपडेट नहीं किया गया है। django-chronograph अधिक वर्तमान प्रतीत होता है। –

2

मैं django-chronograph पर एक नज़र डालने का सुझाव देता हूं। मूल रूप से यह वही करता है जो आप अन्य सुझावों के समान तरीके से चाहते हैं + यह आपको व्यवस्थापक पैनल के माध्यम से अपने क्रॉन नौकरियों को प्रबंधित करने की क्षमता प्रदान करता है। क्रोन नौकरियों को django आदेश के रूप में लागू किया जाना है। इसके बाद आप

python manage.py cron 

पर कॉल करके सभी लंबित नौकरियां चला सकते हैं जिन्हें आपके क्रॉन द्वारा ट्रिगर किया जाना चाहिए।

+1

django chronograph में एक बेवकूफ आयात त्रुटि है जिसे खोज के साथ हल किया जा सकता है। - प्रकार f -print0 | xargs -0 sed -i/django.conf.urls.defaults आयात पैटर्न, url/django.conf.urls से आयात पैटर्न, url, शामिल/g ' या संस्करण पहचान के लिए आधार पुस्तकालय में पैच शामिल है। – RobotHumans

8

प्रबंधन चलाने का अशोक के सुझाव आदेशों के माध्यम से क्रॉन अच्छी तरह काम करता है, लेकिन आप एक छोटे से अधिक मजबूत कुछ मैं Kronos की तरह एक पुस्तकालय में देखना चाहते हैं के लिए देख रहे हैं:

# app/cron.py 

import kronos 

@kronos.register('0 * * * *') 
def task(): 
    pass