Как запустить отдельное приложение в фоне 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'
Вернуться на верх