繁体   English   中英

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

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

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

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

有人可以帮我解决这个问题或引导我朝着正确的方向前进吗?

您的问题的解决方案是使用 BackgroundScheduler 和/或 Cron 作业。 这些在后台工作,不会影响您的 django 服务器,因此您可以像往常一样服务器文件和数据。

我个人在我的 django 应用程序中使用 APScheduler 来调度后台任务,这是一个很棒的模块,但需要一些文档。 它具有不同类型的任务调度程序,因此您可以尝试它们。

APScheduler 指南

根据 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 函数

在应用程序.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...............")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM