You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bottle Web服务器中访问Runtime创建的RelayController实例?

解决Bottle框架中传递Runtime创建实例的简单方案

针对你的自用场景,以下几个极简方案完全够用:

方案1:全局变量共享(最直接)

在Web模块里定义一个全局变量,main.py初始化继电器实例后直接赋值给它。

web_app.py:

from bottle import Bottle, template

app = Bottle()
relay_controller = None  # 预留全局变量存储实例

@app.route('/')
def index():
    # 直接使用全局变量获取继电器状态
    relay_status = relay_controller.get_status_dict()
    return template('relay_template', status=relay_status)

@app.route('/toggle/<relay_id>')
def toggle_relay(relay_id):
    relay_controller.toggle_relay(relay_id)
    return index()

main.py:

from relay_controller import RelayController
import web_app

# 初始化继电器控制器实例
config = {"relays": [...] }
relay_ctrl = RelayController(config)
relay_ctrl.start()

# 将实例绑定到Web模块的全局变量
web_app.relay_controller = relay_ctrl

# 启动Bottle服务
from bottle import run
run(app=web_app.app, host='0.0.0.0', port=8080)

方案2:路由直接写在main.py(最紧凑)

如果项目规模小,直接把Bottle路由逻辑放在main.py里,省去跨文件传递的麻烦。

main.py:

from relay_controller import RelayController
from bottle import Bottle, template, run

# 初始化继电器控制器
config = {"relays": [...] }
relay_ctrl = RelayController(config)
relay_ctrl.start()

# 创建Bottle应用并注册路由
app = Bottle()

@app.route('/')
def index():
    relay_status = relay_ctrl.get_status_dict()
    return template('relay_template', status=relay_status)

@app.route('/toggle/<relay_id>')
def toggle_relay(relay_id):
    relay_ctrl.toggle_relay(relay_id)
    return index()

# 启动Web服务
run(app=app, host='0.0.0.0', port=8080)

方案3:利用Bottle的配置对象(稍规整)

用Bottle自带的应用配置存储实例,比全局变量更符合框架习惯。

web_app.py:

from bottle import Bottle, template, request

app = Bottle()

@app.route('/')
def index():
    # 从应用配置中获取实例
    relay_controller = request.app.config['relay_controller']
    relay_status = relay_controller.get_status_dict()
    return template('relay_template', status=relay_status)

@app.route('/toggle/<relay_id>')
def toggle_relay(relay_id):
    relay_controller = request.app.config['relay_controller']
    relay_controller.toggle_relay(relay_id)
    return index()

main.py:

from relay_controller import RelayController
import web_app

config = {"relays": [...] }
relay_ctrl = RelayController(config)
relay_ctrl.start()

# 将实例存入Web应用的配置
web_app.app.config['relay_controller'] = relay_ctrl

run(app=web_app.app, host='0.0.0.0', port=8080)

以上三个方案都不需要复杂的依赖注入或多线程处理,完全适配你的自用场景,选最顺手的就行。

内容的提问来源于stack exchange,提问作者sb21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 22:22:45