Flask 按钮问题 on/off

Flask issue with button on/off

我正在使用 flask 开发一个网络界面,用户可以在其中输入表单中的值,然后通过 http 服务器发送该值。之后,我收集这些值并将它们发送到服务器 OPC-UA 与应该旋转的电机相连。

我想填写一个表格,然后单击“提交”按钮保存值。但我还想创建另一个按钮,当我单击它时,它会自动使用默认值填充表单(在我的例子中,我希望到处都是 0)。第二个按钮是按钮“ON/OFF”。一开始,按钮是'Off',这意味着我们必须发送值0(当我们发送angle=0,speed=0 ...时电机不旋转)。 然后当它打开时我可以发送值。

“提交”按钮运行良好,可以正确发送用户选择的值。

但是,我不知道为什么另一个按钮不起作用。每当我点击它时,没有任何反应,也没有错误信息。

这是我的代码:

# sends data from html form to database
from flask import Flask 
from flask import request 
from flask import render_template

app = Flask(__name__)
@app.route('/')
def form():
    return render_template('form.html',drive_state='Off') 


function_id = 0
angle = 0
speed = 0

@app.route('/', methods=['POST'])
def get_parameters():
    if request.form.get("submit"):
        function_id = request.form['function_id']
        angle = request.form['angle']
        speed = request.form['speed']  
        opc_state = 1
        print(function_id)
        print(angle)
        print(speed)
        # drive_state=request.form['drive_state'] 
    if request.form.get("turn_on"):
        function_id = 0
        angle = 0
        speed = 0
        # call opcua func    
        # opcua_state = opc_read
        opc_state = 0
        if opc_state == 0:
            drive_state = 'Off'
            opc_state = 1
        if opc_state == 1:
            drive_state = 'On'
            opc_state = 0

    # return redirect(request.url)
    return render_template('form.html', function_id=function_id, angle=angle, speed=speed)
# get_parameters()
# print(form_params)

<!DOCTYPE HTML>
<html>
<head>
    <title>Sample page to test fill_web_form.py</title>
</head>
<body>
    <p1><strong>SAMPLE PAGE TO TEST FILL_WEB_FORM.PY</strong></p1>

    <!--test form-->
    <form method="post" action="/">
        Test the motor:<br>
        <table> 
            <tr> 
                <td> Function number: </td> 
                <td> <input type="text" name="function_id" value={{function_id}}> </td> 
            </tr> 
            <tr> 
                <td> Angle: </td> 
                <td> <input type="text" name="angle" value={{angle}}> </td> 
            </tr> 
            <tr> 
                <td> Speed: </td> 
                <td> <input type="text" name="speed" value={{speed}}> </td> 
            </tr> 
            <tr> 
                <td> <input type="submit" name="submit" Value="Submit"> </td> 
            </tr> 
            <tr> 
                <td> <input type="button" name="drive_state" Value={{drive_state}}> </td> 
            </tr>
        </table>
    </form>
</body>
</html>

用户界面如下所示:

我发现问题很少。

首先。第二个按钮的名称为 name="drive_state" 但您检查名称

if request.form.get("turn_on"):

你必须检查

if request.form.get("drive_state"):

但是必须type="submit"才能发送到服务器。

 <input type="submit" name="drive_state" Value={{drive_state}}> 

其他问题是函数中的局部变量在请求之间被删除。您必须使用 global 来通知函数它必须将其保存在全局变量中,这样它们就不会被删除。


另一个问题。如果你运行

    if opc_state == 0:
        #... code ...
        opc_state = 1

    if opc_state == 1:
        # ... code ...
        opc_state = 0

然后第一个 if 将设置 opc_state = 1 但接下来 运行 第二个 if 将设置回 opc_state = 0。您必须使用 elif 否则

    if opc_state == 0:
        #... code ...
        opc_state = 1

    #elif opc_state == 1:
    else:
        # ... code ...
        opc_state = 0

而您忘记将 drive_state 发送到模板


直接在代码中使用 HTML 的最小工作代码,因此每个人都可以简单地复制它并 运行 它。

html = '''<!DOCTYPE HTML>
<html>
<head>
    <title>Sample page to test fill_web_form.py</title>
</head>
<body>
    <p1><strong>SAMPLE PAGE TO TEST FILL_WEB_FORM.PY</strong></p1>

    <!--test form-->
    <form method="post" action="/">
        Test the motor:<br>
        <table> 
            <tr> 
                <td> Function number: </td> 
                <td> <input type="text" name="function_id" value={{function_id}}> </td> 
            </tr> 
            <tr> 
                <td> Angle: </td> 
                <td> <input type="text" name="angle" value={{angle}}> </td> 
            </tr> 
            <tr> 
                <td> Speed: </td> 
                <td> <input type="text" name="speed" value={{speed}}> </td> 
            </tr> 
            <tr> 
                <td> <input type="submit" name="submit" Value="Submit"> </td> 
            </tr> 
            <tr> 
                <td> <input type="submit" name="drive_state" Value={{drive_state}}> </td> 
            </tr>
        </table>
    </form>
</body>
</html>'''

# sends data from html form to database
from flask import Flask 
from flask import request 
from flask import render_template_string

app = Flask(__name__)
@app.route('/')
def form():
    return render_template_string(html, drive_state='Off') 

function_id = 0
angle = 0
speed = 0
drive_state = 'Off'
opc_state = 0

@app.route('/', methods=['POST'])
def get_parameters():
    global function_id
    global angle
    global speed
    global drive_state
    global opc_state
    
    if request.form.get("submit"):
        function_id = request.form['function_id']
        angle = request.form['angle']
        speed = request.form['speed']  
        opc_state = 1
        print('function_id:', function_id)
        print('angle:', angle)
        print('speed:', speed)

    if request.form.get("drive_state"):
        function_id = 0
        angle = 0
        speed = 0
        # call opcua func    
        # opcua_state = opc_read
        #opc_state = 0
        
        if opc_state == 0:
            drive_state = 'Off'
            opc_state = 1
        elif opc_state == 1:  # it has to be `else`
            drive_state = 'On'
            opc_state = 0
        print('drive_state:', drive_state)

    # return redirect(request.url)
    return render_template_string(html, function_id=function_id, angle=angle, speed=speed, drive_state=drive_state)

app.run()