Джанго - настроить запланированное задание? - PullRequest
472 голосов
/ 21 февраля 2009

Я работал над веб-приложением с использованием Django, и мне любопытно, есть ли способ запланировать периодическое выполнение задания.

По сути, я просто хочу пробежаться по базе данных и производить некоторые вычисления / обновления на регулярной основе автоматически, но, похоже, не могу найти никакой документации по этому вопросу.

Кто-нибудь знает, как это настроить?

Чтобы уточнить: я знаю, что могу настроить работу cron, чтобы сделать это, но мне любопытно, есть ли какая-то функция в Django, которая обеспечивает эту функцию. Мне бы хотелось, чтобы люди могли самостоятельно развертывать это приложение, не прибегая к настройке (желательно к нулю).

Я подумал о том, чтобы инициировать эти действия «задним числом», просто проверив, нужно ли было выполнять задание с момента последней отправки запроса на сайт, но я надеюсь, что что-то будет чище.

Ответы [ 23 ]

6 голосов
/ 19 июля 2016

Хотя и не является частью Django, Airflow является более новым проектом (по состоянию на 2016 г.), который полезен для управления задачами.

Airflow - это система автоматизации и планирования рабочих процессов, которую можно использовать для создания и управления конвейерами данных. Веб-интерфейс предоставляет разработчику ряд опций для управления и просмотра этих конвейеров.

Воздушный поток написан на Python и построен с использованием Flask.

Airflow был создан Максимом Бошемином (Maxime Beauchemin) в Airbnb и открыт с весны 2015 года. Он присоединился к программе инкубации Apache Software Foundation зимой 2016 года. Вот страница проекта Git и некоторые дополнения справочная информация .

6 голосов
/ 30 октября 2011

Я только что подумал об этом довольно простом решении:

  1. Определить функцию представления do_work (req, param) , как если бы вы работали с любым другим представлением, с отображением URL, возвращать HttpResponse и т. Д.
  2. Установите задание cron с вашими настройками синхронизации (или с помощью AT или запланированных задач в Windows), которое запускает curl http://localhost/your/mapped/url?param=value.

Вы можете добавить параметры, но просто добавив параметры в URL.

Скажите, что вы, ребята, думаете.

[Обновить] Сейчас я использую команду runjob из django-extensions вместо curl.

Мой cron выглядит примерно так:

@hourly python /path/to/project/manage.py runjobs hourly

... и так далее для ежедневных, ежемесячных и т. Д. Вы также можете настроить его для запуска определенной работы.

Я считаю это более управляемым и более чистым. Не требует сопоставления URL-адреса с представлением. Просто определите свой класс работы и crontab, и все готово.

6 голосов
/ 08 января 2010

Поместите следующее в начало вашего файла 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
4 голосов
/ 17 мая 2011

после части кода я могу написать что угодно, как мои 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)
#######################################

из http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/

3 голосов
/ 04 августа 2018

Вы обязательно должны проверить 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,
},
}
2 голосов
/ 02 сентября 2011

У меня было что-то похожее с вашей проблемой сегодня.

Я не хотел, чтобы он обрабатывался сервером через cron (и в конце концов большинство библиотек были просто помощниками cron).

Итак, я создал модуль планирования и прикрепил его к init .

Это не лучший подход, но он помогает мне хранить весь код в одном месте, а его выполнение связано с основным приложением.

2 голосов
/ 26 марта 2014

Да, вышеописанный метод очень хорош. И я попробовал некоторые из них. Наконец-то я нашел такой метод:

    from threading import Timer

    def sync():

        do something...

        sync_timer = Timer(self.interval, sync, ())
        sync_timer.start()

Так же, как Рекурсивный .

Хорошо, я надеюсь, что этот метод может удовлетворить ваши требования. :)

2 голосов
/ 11 ноября 2017

Более современным решением (по сравнению с сельдереем) является Django Q: https://django -q.readthedocs.io / ен / последний / index.html

Имеет отличную документацию и прост в обращении. Поддержка Windows отсутствует, поскольку Windows не поддерживает разветвление процессов. Но это прекрасно работает, если вы создаете свою среду разработки, используя подсистему Windows для Linux.

1 голос
/ 01 сентября 2015

Я использую сельдерей для создания своих периодических заданий. Сначала вам нужно установить его следующим образом:

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
1 голос
/ 11 января 2017

Я не уверен, что это кому-нибудь пригодится, поскольку мне пришлось предоставлять другим пользователям системы для планирования заданий, не предоставляя им доступ к фактическому планировщику задач сервера (windows), я создал это приложение многократного использования.

Обратите внимание, что пользователи имеют доступ к одной общей папке на сервере, где они могут создавать необходимые файлы command / task / .bat. Эта задача может быть запланирована с помощью этого приложения.

Имя приложения Django_Windows_Scheduler

ScreenShot: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...