Django-Настроить Запланированное Задание?



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



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



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



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



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

2063   21  

21 ответов:

одно решение, которое я использовал, чтобы сделать это:

1) Создать управление командой, например,

python manage.py my_cool_command

2) Использовать 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 не работает параллельно (в случае, если сами кроны занимают больше времени бежать, чем их частота!)

спасибо!

Если вы используете стандартную ОС POSIX, вы используете cron.

Если вы используете Windows, вы используете at.

напишите команду управления Django в

  1. выяснить, на какой платформе они.

  2. либо выполните соответствующую команду " AT " для ваших пользователей, или обновите кронтаб для своих пользователей.

интересное новое подключаемое приложение Django:django-хронограф

вам нужно только добавить одну запись cron, которая действует как таймер, и у вас есть очень хороший интерфейс администратора Django в сценарии для запуска.

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

см.:http://code.google.com/p/django-poormanscron/

предложение Брайана Нила о запуске команд управления через 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

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

  1. определить вид функции do_work (req, param) как и в любом другом представлении, с отображением URL, возвращайте HttpResponse и так далее.
  2. настройте задание 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

скриншот: enter image description here

более современным решением (по сравнению с сельдереем) является 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.

см.:http://taskhawk.readthedocs.io

Comments

    Ничего не найдено.