Использование 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 ?

Второе решение – создайте мою функцию отправки в любом месте (как обычную функцию 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 call: 0 0 * * * python /path/to/project/run.py newsletter.views daily_job()

Какой метод будет работать, или что лучше?

7 Solutions collect form web for “Использование crontab с django”

я бы предложил создать вашу функциональность как django-management-command и запустить ее через crontab

если ваша команда send_newsletter то просто

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

и вам не нужно заботиться о настройке модуля настроек в этом случае /

Предположение Ashok об управлении командами управления через cron работает хорошо, но если вы ищете что-то более надежное, я бы заглянул в библиотеку, такую ​​как Kronos :

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

Предлагаю взглянуть на django-хронограф . В основном, он делает то, что вы хотите, в соответствии с другими предложениями +, это дает вам возможность управлять вашими заданиями cron через панель администратора. Работы Cron должны выполняться как команды django. Затем вы можете запустить все ожидающие задания, позвонив

 python manage.py cron 

который должен быть вызван вашим cron.

Я бы рекомендовал вариант 3: использовать систему заданий в django-расширениях . Соответствующими командами расширения являются:

  • create_jobs – создает структуру каталога команд заданий Django для данного имени приложения в текущем каталоге. Это часть впечатляющей системы рабочих мест.
  • runjob – запустить одно техническое задание. Часть системы рабочих мест.
  • runjobs – запускает запланированные задания по техническому обслуживанию. Укажите ежечасно, ежедневно, еженедельно, ежемесячно. Часть системы рабочих мест.

Это позволяет вам управлять всей обработкой работы внутри Django, поэтому вам не нужно постоянно возиться с crontab.

Я написал несколько приложений с командной строкой, используя метод, аналогичный вашему первому варианту. Я предпочитаю делать это таким образом, в отличие от использования DJANGO_SETTINGS_MODULE среды DJANGO_SETTINGS_MODULE потому что она больше похожа на обычную программу Python (для меня).

Вы также должны заметить, что вам не нужно класть ваш модуль в тот же каталог, что и ваш settings.py ; вы можете использовать абсолютный путь Python вашего модуля настроек:

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

PEP 8 все равно препятствует относительному импорту.

Я всегда устанавливаю свои приложения Django в site-packages ( /usr/lib64/python2.6/site-packages on Gentoo), поэтому мне не нужно беспокоиться о настройке PYTHONPATH из моих crontab, но я не считаю, что это широко практикуемый метод. Мне также нравится использовать автоматическое создание сценариев setuptools, чтобы мои консольные скрипты попадали туда, где они должны быть ( /usr/bin , например) и называются соответственно автоматически. Ваш первый вариант также облегчает это.

Существует также django-cron . Он очень прост в использовании, нет ничего другого для установки или настройки.

Однако я не уверен, как это работает … Я имею в виду, что я не знаю, как выполняются задания, и если они запускаются вообще, когда никто не делает запрос на сайт. Но вы можете попробовать!

Вариант 1 работает для меня. Обычно у меня есть сценарий cd в каталоге проекта, а затем выполняйте «python ./script_name.py», чтобы не было таинственных проблем пути … ленив, но он работает последовательно.

  • Что такое хорошее программное обеспечение для веб-магазина на базе python?
  • Как установить файл celeryconfig в django
  • Ошибка компилятора Django с компиляцией SASS (-scss Invalid Option)
  • На простом английском языке, какие общие представления Django?
  • Героку, Джанго, Форман
  • Установите mysqldb на снежный барс
  • как упаковать проект django?
  • Django / gevent socket.IO с redis pubsub. Где я могу поместить вещи?
  •  
    Interesting Posts for Van-Lav

    узлы метки снаружи с минимальным перекрытием с другими узлами / ребрами в networkx

    Как найти месяц спустя с даты с django?

    Настройка Python setuptools / distutils для пакета `extra` с Makefile

    Поэтапное создание массива numpy и измерение использования памяти

    Клиент Python Paho публикует неудачи с по крайней мере 1 пропущенным издательством

    Не удалось найти элемент поиска по ссылке

    Настройка панели инструментов отладки Django

    Pandas scatter_matrix – определение категориальных переменных

    Как изменить местоположение установки по умолчанию для pip

    Может кто-нибудь объяснить это рекурсивным для меня?

    Вычисление спектра мощности

    Pandas – удаление строк на основе комбинаций значений NaN

    Найти все n-мерные линии и диагонали с NumPy

    структура проекта для переноса многих классов c ++ в cython на один общий объект

    python Socket.IO-клиент для отправки широковещательных сообщений на сервер TornadIO2

    Python - лучший язык программирования в мире.