Я бы рекомендовал вариант 3: использовать систему jobs в django-extensions. Соответствующие команды расширения:
create_jobs
- Создает структуру каталога команды Django jobs для заданного имени приложения в текущем каталоге. Это часть впечатляющей системы заданий. runjob
- запускает одно задание на обслуживание. Часть системы jobs. runjobs
- запуск запланированных заданий обслуживания. Укажите ежечасно, ежедневно, еженедельно, ежемесячно. Часть системы заданий. Это позволяет вам управлять всей обработкой заданий внутри Django, так что вам не нужно постоянно возиться с crontab.
Я написал несколько приложений командной строки, используя метод, аналогичный вашему первому варианту. Я предпочитаю делать это таким образом, а не использовать переменную среды 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 в пакетах сайтов ( /usr/lib64/python2.6/site-packages
в Gentoo), поэтому мне не нужно беспокоиться о настройке PYTHONPATH
из моих crontab, но я не думаю, что это широко применяемый метод. Мне также нравится использовать setuptools Automatic Script Creation , чтобы мои сценарии консоли помещались там, где они должны быть (например, / usr / bin
), и автоматически получали соответствующие имена. Ваш первый вариант также способствует этому.
Существует также django-cron . Пользоваться им очень просто, больше не нужно ничего устанавливать и настраивать.
Однако , я не уверен, как это работает на самом деле ... Я имею в виду, что я не знаю, как выполняются задания и , выполняются ли они вообще, когда никто не выполняет запрос на сайт. Но вы можете попробовать!
У меня работает вариант 1. Обычно у меня есть скрипт cd в каталог проекта, а затем я делаю "python ./script_name.py", чтобы не было загадочных проблем с путями ... ленивый, но он работает стабильно.
я бы предложил создать вашу функциональность как django-management-command и запускать ее через crontab
если ваша команда send_newsletter
, то просто
0 0 * * * python /path/to/project/manage.py send_newsletter
и вам не нужно заботиться об установке модуля настроек в этом случае/