Настроить запланированную задачу?
Я разрабатываю веб-приложение на Django и хочу узнать, есть ли способ запланировать выполнение задания с периодичностью.
В основном, мне нужно регулярно проходить по базе данных и выполнять некоторые вычисления/обновления автоматически, но я не могу найти документацию по этому вопросу.
Кто-нибудь знает, как это настроить?
Для уточнения: я понимаю, что можно установить задачу с помощью cron
, но мне интересно, есть ли в Django встроенная функция для этой функциональности. Я хотел бы, чтобы пользователи могли развернуть это приложение самостоятельно, не нужно было бы проводить много настройок (предпочтительно вообще никаких).
Я думал о том, чтобы запускать эти действия "задним числом", просто проверяя, нужно ли было выполнить задание с момента последнего запроса к сайту, но надеюсь найти что-то более элегантное.
5 ответ(ов)
Мы открыли исходный код приложения, которое, на мой взгляд, представляет собой структурированное решение, к которому ссылается ответ Брайана. Мы будем рады любым отзывам!
Ссылка на репозиторий: django-cron
В нем есть одна команда управления:
./manage.py runcrons
Она выполняет свою задачу. Каждый cron представлен в виде класса (поэтому всё основано на объектно-ориентированном подходе), и каждый cron запускается с разной частотой. Мы также гарантируем, что один и тот же тип cron не запускается параллельно, чтобы избежать ситуации, когда выполнение crons занимает больше времени, чем их частота запуска!
Django Poor Man's Cron — это приложение для Django, которое использует спам-ботов, роботов поиска и подобные технологии для выполнения запланированных задач с приблизительно регулярными интервалами. Это может быть полезно, если у вас нет возможности использовать системные планировщики задач, такие как cron.
Вы можете найти его по следующей ссылке: Django Poor Man's Cron.
Обратите внимание, что данный подход подходит не для всех случаев, так как он полагается на внешние факторы, такие как активность ботов. Если вы ищете более надежное решение, возможно, стоит рассмотреть альтернативы, такие как использование Celery для управления задачами.
Django APScheduler для планировщиков задач. Advanced Python Scheduler (APScheduler) — это библиотека Python, которая позволяет вам планировать выполнение вашего кода на Python позже, либо один раз, либо периодически. Вы можете добавлять новые задачи или удалять старые в любой момент по мере необходимости.
Примечание: я автор этой библиотеки.
Установка APScheduler
pip install apscheduler
Функция для вызова из файла
Имя файла: scheduler_jobs.py
def FirstCronTest():
print("")
print("Я выполняюсь..!")
Настройка планировщика
Создайте файл execute.py
и добавьте следующий код:
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
Теперь добавьте ваши функции сюда. Функции планировщика будут записаны в scheduler_jobs
.
import scheduler_jobs
scheduler.add_job(scheduler_jobs.FirstCronTest, 'interval', seconds=10)
scheduler.start()
Связь файла для выполнения
Теперь добавьте следующую строку в конец файла URL:
import execute
- Вы можете проверить полный код, выполнив кликнув здесь.
Чтобы настроить ваш файл cron.py
для использования с проектом Django, добавьте следующий код в верхнюю часть файла:
#!/usr/bin/python
import os
import sys
# Добавьте родительскую директорию проекта в системный путь
sys.path.append('/path/to/')
# Добавьте директорию с проектом в системный путь, если она не находится в пути
sys.path.append('/path/to/project')
# Установите переменную окружения для настроек Django
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'
# Импортируйте необходимые модули и пишите код ниже
Пояснение:
sys.path.append('/path/to/')
добавляет родительскую директорию проекта в путь Python, что позволяет импортировать модули из проекта.sys.path.append('/path/to/project')
добавляет директорию самого проекта, если она не уже включена в системный путь.- Переменная окружения
DJANGO_SETTINGS_MODULE
указывает Django, какие настройки использовать, что необходимо для работы с проектом.
Убедитесь, что вы заменили /path/to/
и myproj.settings
на актуальные значения, соответствующие вашему проекту.
В приведённом вами коде происходит настройка окружения Django, что позволяет запускать внешние скрипты и взаимодействовать с моделями. Рассмотрим, что делает каждая строка:
#######################################
import os, sys
Эти строки импортируют модули os
и sys
, которые необходимы для работы с операционной системой и манипуляций с Python-параметрами.
sys.path.append('/home/administrator/development/store')
При помощи этой строки мы добавляем путь к нашему проекту Django в системный путь. Это позволяет Python находить модули этого проекта при импорте.
os.environ['DJANGO_SETTINGS_MODULE'] = 'store.settings'
Здесь мы указываем переменную окружения DJANGO_SETTINGS_MODULE
. Это необходимо для того, чтобы Django знал, где искать настройки нашего проекта (в данном случае, в модуле store.settings
).
from django.core.management import setup_environ
from store import settings
setup_environ(settings)
Этот кусок кода импортирует функцию setup_environ
из модуля управления Django и вызывает её с параметрами из нашего модуля настроек. Это инициализирует окружение Django, позволяя использовать модели и другие компоненты фреймворка.
Таким образом, после выполнения этого кода, вы можете писать любые скрипты, взаимодействуя с моделями Django в том же стиле, что и в вашем views.py
.
Пожалуйста, убедитесь, что у вас корректно установлены все зависимости и что вы находитесь в правильной рабочей директории, иначе скрипт может не сработать.
Превысил ли Django 100 тыс. посещений в день? [закрыто]
Как получить значения GET-запроса в Django?
Разделение бизнес-логики и доступа к данным в Django
Почему выполнение запланированных задач с использованием Celery предпочтительнее, чем crontab?
Как выполнить поиск в стиле getattr() в шаблоне Django