当服务器正常工作时,我如何 运行 在 Django 中循环?

How do I run a loop in Django while server is working as usual?

我正在尝试创建一个 csgo 交易网站,用户可以在其中提取和存入皮肤。为此,我创建了一个机器人账户,用于向客户发送交易报价。现在我需要以某种方式确认交易已被用户接受。我是新手,所以可能有一个更好、更简单的解决方案,我就是想不通。我正在使用 steampy 库。

我认为的解决方案是 运行 一个检查报价及其状态的函数循环。并且在状态变化时会更新数据库。但我不知道如何在 Django 中创建这样的函数,这样服务器也会同时 运行ning。我还想在生产中使用这个项目,所以 运行从我的计算机上安装脚本不是解决方案。

有人可以帮我解决这个问题或指引我正确的方向吗?

您的问题的解决方案是使用 BackgroundSchedulers and/or Cron 作业。这些在后台工作,不会影响您的 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...")

从 django 启动调用 alerts_check 函数

在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...............")