Django-Настроить Запланированное Задание?
Я работаю над веб-приложением с использованием Django, и мне любопытно, есть ли способ запланировать работу для периодического запуска.
в основном я просто хочу запустить базу данных и сделать некоторые вычисления/обновления на автоматической, регулярной основе, но я не могу найти никакой документации по этому вопросу.
кто-нибудь знает как это настроить?
чтобы уточнить: я знаю, что могу настроить cron работа, чтобы сделать это, но я интересно, если есть некоторые функции в Django, который обеспечивает эту функциональность. Я хотел бы, чтобы люди могли самостоятельно развернуть это приложение, не делая много настроек (желательно ноль).
Я рассматривал возможность запуска этих действий "задним числом", просто проверяя, должно ли быть выполнено задание с момента последнего отправки запроса на сайт, но я надеюсь на что-то немного более чистое.
21 ответов:
одно решение, которое я использовал, чтобы сделать это:
1) Создать управление командой, например,
python manage.py my_cool_command2) Использовать
cron(в Linux) илиat(в Windows) для запуска моей команды в нужное время.Это простое решение, которое не требует установки тяжелого стека AMQP. Однако есть хорошие преимущества в использовании чего-то вроде сельдерея, упомянутого в других ответах. В частности, с сельдереем приятно не необходимо распространить логику приложения в файлы crontab. Однако решение cron работает довольно хорошо для приложений малого и среднего размера и где вам не нужно много внешних зависимостей.
EDIT:
в более поздней версии windows the
atкоманда устарела для Windows 8, Server 2012 и выше. Вы можете использоватьschtasks.exeдля того же использования.
сельдерей - это распределенная очередь задач, построенная на AMQP (RabbitMQ). Он также осуществляет периодические задачи в хрон-как мода (см. периодические задачи). В зависимости от вашего приложения, это может быть стоит взглянуть.
сельдерей довольно легко настроить с django ( docs), и периодические задачи фактически пропускать пропущенные задачи в случае простоя. Сельдерей также имеет встроенные механизмы повтора, в случае неудачи задачи.
мы с открытым исходным кодом, что я думаю, это структурированное приложение. это решение Брайана выше тоже намекает. Хотелось бы любой / все отзывы!
https://github.com/tivix/django-cron
Он поставляется с одной командой управления:
./manage.py runcronsэто делает работу. Каждый cron моделируется как класс (так что все его OO), и каждый cron работает с разной частотой, и мы гарантируем, что один и тот же тип cron не работает параллельно (в случае, если сами кроны занимают больше времени бежать, чем их частота!)
спасибо!
интересное новое подключаемое приложение Django:django-хронограф
вам нужно только добавить одну запись cron, которая действует как таймер, и у вас есть очень хороший интерфейс администратора Django в сценарии для запуска.
посмотрите на Cron Django Poor Man, который является приложением Django, которое использует спам-боты, поисковые роботы индексирования и т. д. Для выполнения запланированных задач примерно через регулярные промежутки времени
предложение Брайана Нила о запуске команд управления через cron работает хорошо, но если вы ищете что-то более надежное (но не такое сложное, как сельдерей), я бы заглянул в библиотеку, такую как Кронос:
# app/cron.py import kronos @kronos.register('0 * * * *') def task(): pass
RabbitMQ и сельдерей имеют больше функций и возможностей обработки задач, чем Cron. Если сбой задачи не является проблемой, и вы думаете, что будете обрабатывать сломанные задачи в следующем вызове, то Cron достаточно.
сельдерей & AMQP позволит вам справиться с сломанной задачей, и она будет выполнена снова другим работником (сельдерей рабочие слушают для следующей задачи для работы), пока задача не
max_retriesатрибут достигнут. Вы даже можете вызывать задачи при сбое, такие как ведение журнала сбой или отправка электронной почты администратору послеmax_retriesбыла достигнута.и вы можете распространять серверы Celery и AMQP, когда вам нужно масштабировать свое приложение.
Я лично использую cron, но Планирование Заданий разделы django-extensions выглядит интересно.
поместите следующее в верхней части вашего cron.py файл:
#!/usr/bin/python import os, sys sys.path.append('/path/to/') # the parent directory of the project sys.path.append('/path/to/project') # these lines only needed if not on path os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings' # imports and code below
Я просто подумал об этом довольно простом решении:
- определить вид функции do_work (req, param) как и в любом другом представлении, с отображением URL, возвращайте HttpResponse и так далее.
- настройте задание cron с вашими настройками времени (или с помощью AT или запланированных задач в Windows), которое работает curl http://localhost/your/mapped/url?Параметр=Значение.
вы можете добавить параметры, но просто при добавлении параметров в URL.
скажите мне, что вы думаете.
[обновление] теперь я использую команду runjob от django-extensions вместо завитка.
мой cron выглядит примерно так:
@hourly python /path/to/project/manage.py runjobs hourly... и так далее для ежедневного, ежемесячного, etc'. Вы также можете настроить его для выполнения определенной работы.
Я нахожу его более управляемым и чище. Не требует сопоставления URL-адреса с представлением. Просто определите свой класс работы и кронтаб и ты готов.
хотя и не часть Джанго,расход это более поздний проект (по состоянию на 2016 год), который полезен для управления задачами.
Airflow-это система автоматизации и планирования рабочего процесса, которая может использоваться для создания и управления конвейерами данных. Веб-интерфейс предоставляет разработчику ряд опций для управления и просмотра этих конвейеров.
воздушный поток написан на Python и построен с использованием колбы.
воздушный поток была создана Максим Beauchemin на Airbnb и с открытым исходным кодом весной 2015 года. Он присоединился к инкубационной программе Apache Software Foundation зимой 2016 года. Вот это страница проекта Git и дополнение справочная информация.
У меня было точно такое же требование некоторое время назад, и в конечном итоге решить его с помощью APScheduler (Руководство Пользователя)
это делает планирование заданий очень простым и сохраняет его независимым от выполнения на основе запроса некоторого кода. Ниже приведен простой пример, который я использовал в своем коде.
from apscheduler.schedulers.background import BackgroundScheduler scheduler = BackgroundScheduler() job = None def tick(): print('One tick!')\ def start_job(): global job job = scheduler.add_job(tick, 'interval', seconds=3600) try: scheduler.start() except: passнадеюсь, это кому-то поможет!
после части кода, я могу написать что-нибудь так же, как мой views.py :)
####################################### import os,sys sys.path.append('/home/administrator/development/store') os.environ['DJANGO_SETTINGS_MODULE']='store.settings' from django.core.management impor setup_environ from store import settings setup_environ(settings) #######################################from http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/
У меня было что-то подобное с вашей проблемой сегодня.
Я не хотел, чтобы это обрабатывалось сервером trhough cron (и большинство библиотек были просто помощниками cron в конце концов).
поэтому я создал модуль планирования и прикрепил его к init .
Это не лучший подход, но он помогает мне иметь весь код в одном месте и с его выполнением, связанным с основным приложением.
Да, метод выше настолько велик. И я попробовал некоторые из них. Наконец, я нашел такой метод:
from threading import Timer def sync(): do something... sync_timer = Timer(self.interval, sync, ()) sync_timer.start()как рекурсивные.
Ок, я надеюсь, что этот метод может удовлетворить ваши требования. :)
Я использую сельдерей для создания периодических задач. Сначала нужно установить его следующим образом:
pip install django-celeryне забудьте зарегистрироваться
django-celeryв настройках и тогда вы могли бы сделать что-то вроде этого:from celery import task from celery.decorators import periodic_task from celery.task.schedules import crontab from celery.utils.log import get_task_logger @periodic_task(run_every=crontab(minute="0", hour="23")) def do_every_midnight(): #your code
Я не уверен, что это будет полезно для кого-либо, так как я должен был предоставить другим пользователям системы для планирования заданий, не давая им доступа к фактическому планировщику задач сервера(windows), я создал это многоразовое приложение.
обратите внимание, что пользователи имеют доступ к одной общей папке на сервере, где они могут создавать необходимые команды/задачи/.Bat-файл. Эта задача затем может быть запланирована с помощью этого приложения.
название приложения Django_Windows_Scheduler
более современным решением (по сравнению с сельдереем) является Django Q: https://django-q.readthedocs.io/en/latest/index.html
Он имеет большую документацию и легко Грок. Поддержка Windows отсутствует, потому что Windows не поддерживает процесс разветвления. Но он отлично работает, если вы создаете свою среду разработки с помощью подсистемы Windows для Linux.
вы обязательно должны проверить django-q! Он не требует дополнительной настройки и, вполне возможно, имеет все необходимое для решения любых производственных вопросов на коммерческих проектах.
он активно развивается и очень хорошо интегрируется с django, django ORM, mongo, redis. Вот моя конфигурация:
# django-q # ------------------------------------------------------------------------- # See: http://django-q.readthedocs.io/en/latest/configure.html Q_CLUSTER = { # Match recommended settings from docs. 'name': 'DjangoORM', 'workers': 4, 'queue_limit': 50, 'bulk': 10, 'orm': 'default', # Custom Settings # --------------- # Limit the amount of successful tasks saved to Django. 'save_limit': 10000, # See https://github.com/Koed00/django-q/issues/110. 'catch_up': False, # Number of seconds a worker can spend on a task before it's terminated. 'timeout': 60 * 5, # Number of seconds a broker will wait for a cluster to finish a task before presenting it again. This needs to be # longer than `timeout`, otherwise the same task will be processed multiple times. 'retry': 60 * 6, # Whether to force all async() calls to be run with sync=True (making them synchronous). 'sync': False, # Redirect worker exceptions directly to Sentry error reporter. 'error_reporter': { 'sentry': RAVEN_CONFIG, }, }
Если вы хотите чего-то большего надежный чем сельдерей попробуй TaskHawk, который построен на вершине AWS SQS / SNS.

Comments