在Flask中使用.getJSON请求时,只运行一次命令

Run command only once when request with .getJSON in Flask

本文关键字:运行 命令 一次 Flask getJSON 请求      更新时间:2023-09-26

我正在尝试制作一个web界面,使用Pyserial显示Arduino的串行输出。我正在使用Ajax($.getJSON)来更新我的HTML字符串。

我现在遇到的问题是,每次请求JSON数据时,它都会初始化我的ser = serial.Serial('/dev/cu.wchusbserialfa140',9600),这会使查询速度变慢,并禁止串行输出的实时更新。

我的代码如下:

我正在尽力只执行一次serial.Serial()

@app.before_request
def before_request():
    g.status = False

@app.route('/')
def template():
    return render_template('index.html')

@app.route('/result')
def serial_monitor():   
    #connect to serial port for once
    if g.status == False:
        ser = serial.Serial('/dev/cu.wchusbserialfa140',9600)
        g.status = True
        result = str(ser.readline())
        voltage = {'value':result}
    else:
        result = str(ser.readline())
        voltage = {'value':result}
    return jsonify(voltage)

我的javascript:我正在使用setInterval自动重复它。

$.getJSON($SCRIPT_ROOT + '/result', function(data)
    {$('#voltage').text(data.value);});

我一直在努力学习制作我的小网页界面,Stackoverflow对我帮助很大。我已经搜索并努力解决这个问题,但我认为现在值得联系。提前感谢大家!!


编辑:

我对它进行了一些黑客攻击,以使它做我现在想做的事情。然而,我计划在运行serial.Serial行之前使用一个表单从用户那里获取端口值。我还在看session/global variable路线。

global ser
ser = serial.Serial('port',9600)    

@app.route('/')
def template(): 
    return render_template('index.html')

@app.route('/result')
def serial_monitor():   
    result = str(ser.readline())
    voltage = {'value':result}
    return jsonify(voltage)

以下是我找到的解决方案。

通过正确设置全局变量状态(在函数内部),我现在可以只运行一次任何代码。

@app.route('/')
def template():
    return render_template('index.html')
status = False
@app.route('/result')
def serial_monitor():   
    global status
    #connect to serial port for once
    if status== False:
        ser = serial.Serial('/dev/cu.wchusbserialfa140',9600)
        status = True
    result = str(ser.readline())
    voltage = {'value':result}
    return jsonify(voltage)

也许可以将ser保留为全局变量(尽管如果您使用多个基于流程的工作者,这可能会成为一个问题),这样您就不必每次都打开它,只需打开seek或任何需要进入正确状态的东西(我对serial一无所知,所以这可能有意义,也可能没有意义)。或者voltage也可以是全局的,并在后台线程中不断更新,因此serial_monitor函数只需要读取变量的最新值。