Как запустить цикл в Django, пока сервер работает в обычном режиме?

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

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

Может ли кто-нибудь помочь мне с этой проблемой или направить меня в правильном направлении?

решением вашей проблемы будет использование BackgroundSchedulers и/или Cron jobs. Они работают в фоновом режиме и не влияют на ваш сервер django, так что вы можете работать с файлами и данными как обычно.

Лично я использую APScheduler для своего django приложения для планирования фоновых задач, это удивительный модуль, но требует некоторой документации. Он имеет различные типы планировщиков задач, так что вы можете попробовать их.

APScheduler Guide

Основываясь на ответе SimbaOG, я выполнил следующие шаги, которые сработали для меня отлично:

инициализировать планировщик

создан alerts_check.py

from apscheduler.schedulers.background import BackgroundScheduler

# added schedule, ensure its only done once
def alerts_schedule():
    scheduler = BackgroundScheduler()
    if not scheduler.get_job('alert_check_job'):
        scheduler.add_job(alerts_check, 'interval', seconds=30, id='alert_check_job')
        scheduler.start()


    def alerts_check():
        # somewhere init log with logging.getLogger(__name__)
        log.info("****** checking for alerts...")

Вызов функции alerts_check из django startup

В apps.py

from django.apps import AppConfig as DjangoAppConfig

import logging
import sys, os


log = logging.getLogger(__name__)

class AppConfig(DjangoAppConfig):
    name = "app"
    def ready(self):
        # use an environment variable to run once only
        # check for 'runserver' so migrate etc is avoided

        once_key = 'CMD_RUN_ONCE'
        run_once = os.environ.get(once_key) 

        if run_once is not None or 'runserver' not in sys.argv:
            return True

        os.environ[once_key] = 'True' 

        # import is done only here after models are loaded            
        from app.alerts_check import alerts_schedule

        alerts_schedule()
        log.info(f"Service has started...............")
Вернуться на верх