Как запустить отдельное приложение в фоне Django?
Столкнулся с такой проблемой, что я не знаю как реализовать приложение, работающее в фоне Django. Дано: У меня есть Web-сервис, который может отдавать/принимать данные через API. Мне нужно сделать так, чтобы в фоне 24/7 отправлялись запросы (используя данные "клиентов") на стороннее API и собиралась статистика. Собрать статистику и отправить запросы - это не проблема. Но вот как этот процесс реализовать в фоне, чтобы он работал всё время пока сервер включён я не знаю. Буду рад любым советам/ресурсам
Советую посмотреть в сторону Celery + Django.
Celery — это простая, гибкая и надежная распределенная система для обработки большого количества сообщений, предоставляющая операции с инструментами, необходимыми для обслуживания такой системы.
Запуск в фоне:
python3 -m celery -A __name_queue__ beat -l info -f ./beat.log
Можно с supervisor: /etc/supervisor/conf.d/*.conf
[program:celery_beat]
command=/root/__project_dir__/bin/start_celery_beat.sh
process_name=%(program_name)s
numprocs=1
autostart=true
autorestart=true
redirect_stderr=true
/root/project_dir/bin/start_celery_beat.sh
#!/bin/bash
cd /root/__project_dir__/src/__src_dir__/
docker run -p 6379:6379 -d redis
pwd
exec python3 -m celery -A __name_queue__ beat -l info -f ./beat.log
Установка
pip install celery
Обычно я работаю с redis установленном через docker:
docker run -p 6379:6379 -d redis
Настройка
/root/project_dir/src/src_dir/project_name/init.py
from .celery_serv import app as celery_app
__all__ = ('celery_app',)
/root/project_dir/src/src_dir/name_app/tasks.py
from imitator_fedsfm.celery_serv import app
""" Задания выполняемые по расписанию """
@app.task
def query_api():
""" Ваш код """
pass
Каждые пять минут вызывать задачу (name_app.tasks.query_api) /root/project_dir/src/src_dir/project_name/celery.py
import os
from celery import Celery
from celery.schedules import crontab
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '__project_name__.settings')
os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1')
app = Celery('__name_queue__')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
app.conf.beat_schedule = {
'imitator-search-updates': {
'task': '__name_app__.tasks.query_api',
'schedule': crontab(minute='*/5'),
}
}
app.conf.timezone = 'UTC'
В настройках Django: /root/project_dir/src/src_dir/project_name/settings.py
"""....."""
REDIS_HOST = ''
REDIS_PORT = ''
CELERY_BROKER_URL = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
CELERY_BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600}
CELERY_RESULT_BACKEND = 'redis://' + REDIS_HOST + ':' + REDIS_PORT + '/0'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'