如何在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
相关产品推荐
相关产品推荐

