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()
我正在使用 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()