Django – настроить запланированное задание?

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

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

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

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

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

  • Как получить файл и SHA-1 дайджест загруженного файла?
  • Большие данные POST повреждены при использовании Django / PyISAPIe / IIS
  • Когда Django просматривает первичный ключ внешних ключей?
  • Каков самый простой способ удалить все пакеты, установленные в pip?
  • Установка значения по умолчанию для поля в наборе форм в Django
  • Инструменты, помогающие разработчикам быстрее читать иерархию классов
  • Как исключить значение в ModelMultipleChoiceField?
  • Преобразование даты и времени UTC в локальную дату и время пользователя
  • 18 Solutions collect form web for “Django – настроить запланированное задание?”

    Одно из решений, которое я использовал, – это сделать следующее:

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

     python manage.py my_cool_command 

    2) Используйте cron (в Linux) или at (в Windows) для запуска моей команды в требуемое время.

    Это простое решение, которое не требует установки тяжелого стека AMQP. Однако есть хорошие преимущества в использовании чего-то типа сельдерея, упомянутого в других ответах. В частности, с Celery неплохо не распространять логику приложения в файлы crontab. Однако решение cron работает довольно хорошо для приложения малого и среднего размера, и вам не нужно много внешних зависимостей.

    РЕДАКТИРОВАТЬ:

    В более поздней версии окон команда at устарела для Windows 8, Server 2012 и выше. Вы можете использовать schtasks.exe для schtasks.exe же использования.

    Сельдерей – это распределенная задача, построенная на AMQP (RabbitMQ). Он также обрабатывает периодические задачи в виде cron-like (см. Периодические задания ). В зависимости от вашего приложения это может стоить гусара.

    Сельдерей довольно легко настроить с помощью django ( docs ), и периодические задачи фактически пропустят пропущенные задачи в случае простоя. Сельдерей также имеет встроенные механизмы повторного запуска, если задача не выполняется.

    Мы открываем, что я считаю структурированным приложением. что решение Брайана выше намека. Хотелось бы любить любую / всю обратную связь!

    https://github.com/tivix/django-cron

    Он поставляется с одной командой управления:

     ./manage.py runcrons 

    Это делает работу. Каждый cron моделируется как класс (поэтому его все OO), и каждый cron работает на другой частоте, и мы убеждаемся, что один и тот же тип cron не работает параллельно (в случае, если самим кронам требуется больше времени для работы, чем их частота!)

    Благодаря!

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

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

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

    1. Выясните, на какой платформе они работают.

    2. Либо выполните соответствующую команду «AT» для своих пользователей, либо обновите crontab для своих пользователей.

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

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

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

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

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

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

    RabbitMQ и Celery имеют больше возможностей и возможностей обработки задач, чем Cron. Если сбой задачи не является проблемой, и вы думаете, что будете обрабатывать сломанные задачи при следующем вызове, тогда Cron будет достаточным.

    Celery & AMQP позволит вам справиться со сломанной задачей, и она снова будет выполнена другим работником (работники Celery прислушаются к следующей задаче для работы) до тех пор, пока не будет max_retries атрибут max_retries задачи. Вы можете даже вызывать задачи при сбое, например, регистрировать сбой или отправлять электронное письмо администратору после достижения max_retries .

    И вы можете распространять серверы сельдерея и AMQP, когда вам нужно масштабировать приложение.

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

    В верхней части файла 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 

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

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

    Airflow написан на Python и построен с использованием Flask.

    Airflow был создан Maxime Beauchemin на Airbnb и открыт весной 2015 года. Он присоединился к инкубационной программе Apache Software Foundation зимой 2016 года. Здесь представлена страница проекта Git и дополнительная дополнительная информация .

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

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

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

    Вы можете добавлять параметры, а просто добавлять параметры к URL.

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

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

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

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

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

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

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

    Я не хотел, чтобы он обрабатывался сервером 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) Task Task, я создал это многоразовое приложение.

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

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

    Скриншот: введите описание изображения здесь

    У меня было точно такое же требование некоторое время назад, и я решил его решить с помощью APScheduler ( User Guide )

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

     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 

    Надеюсь, это поможет кому-то!

    Interesting Posts

    проблема работает привет мир с веб-сервером торнадо (Python 2.5, Win 7)

    pyqt4 QTextEdit – Как установитьMaxLength?

    python pandas dataframe столбцы конвертировать в dict key и значение

    как я могу прочитать все в настоящее время в subprocess.stdout, а затем вернуться?

    Существует ли межплатформенный способ получения информации из OSError от Python?

    Как я могу визуализировать древовидную структуру (рекурсивную) с использованием шаблона django?

    C # эквивалент вращения списка с использованием операции кусочка python

    строка синтаксического анализа целых наборов с интервалами в список

    Какая разница между синтаксическим разбором HTML и обходом веб-страниц в python

    Ошибка памяти с большими наборами данных для pandas.concat и numpy.append

    В Python можно реализовать поведение mixin без использования наследования?

    SymPy: Как вернуть выражение в терминах других выражений (выражений)?

    разбивать список по условию в python

    mechanize python нажмите кнопку

    Как найти индекс значения в массиве 2d в Python?

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