当服务器正常工作时,我如何 运行 在 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 应用程序以调度程序后台任务,它是一个了不起的模块,但需要一些文档。它有不同类型的任务调度程序,所以你可以尝试它们。
根据 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...............")
我正在尝试创建一个 csgo 交易网站,用户可以在其中提取和存入皮肤。为此,我创建了一个机器人账户,用于向客户发送交易报价。现在我需要以某种方式确认交易已被用户接受。我是新手,所以可能有一个更好、更简单的解决方案,我就是想不通。我正在使用 steampy 库。
我认为的解决方案是 运行 一个检查报价及其状态的函数循环。并且在状态变化时会更新数据库。但我不知道如何在 Django 中创建这样的函数,这样服务器也会同时 运行ning。我还想在生产中使用这个项目,所以 运行从我的计算机上安装脚本不是解决方案。
有人可以帮我解决这个问题或指引我正确的方向吗?
您的问题的解决方案是使用 BackgroundSchedulers and/or Cron 作业。这些在后台工作,不会影响您的 Django 服务器,因此您可以像往常一样处理文件和数据。
我个人将 APScheduler 用于我的 django 应用程序以调度程序后台任务,它是一个了不起的模块,但需要一些文档。它有不同类型的任务调度程序,所以你可以尝试它们。
根据 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...............")