Python 表单按钮输入

Python 表单按钮输入,python,python-3.x,flask,Python,Python 3.x,Flask,所以我用Flask为我家的红外自动装置建立了一个基本的控制面板。但是,我无法理解如何从HTML中的表单中获取响应。所以我基本上有一个按钮,当按下时可以改变设备的状态。我遇到的问题是,获取该响应并在HTML页面上更新它,以表示它处于打开或关闭状态 我的python代码: if request.method == 'POST': if request.form['lamp'] == 'on': btn1 = True s = socke

所以我用Flask为我家的红外自动装置建立了一个基本的控制面板。但是,我无法理解如何从HTML中的表单中获取响应。所以我基本上有一个按钮,当按下时可以改变设备的状态。我遇到的问题是,获取该响应并在HTML页面上更新它,以表示它处于打开或关闭状态

我的python代码:

if request.method == 'POST':
        if request.form['lamp'] == 'on':
            btn1 = True
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((IP, PORT))
            s.send(MSG.encode())
            data = str(s.recv(BUFFER).decode())
            print(data)
            s.close()

        elif request.form['lamp'] == 'off':
            btn1 = False
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((IP, PORT))
            s.send(MSG.encode())
            data = str(s.recv(BUFFER).decode())
            print(data)
            s.close()
以及它使用的HTML部分:

                <form method=post>
                    {%  if btn1 == True  %}
                        <button type=submit class="btn btn-default" name="lamp" value="on"><i class="fa fa-lightbulb-o fa-5x" style="color:yellow;"></i><br>Lamp</button>
                        {{  btn1  }}
                    {% else %}
                        <button type=submit class="btn btn-default" name="lamp" value="off"><i class="fa fa-lightbulb-o fa-5x"></i><br>Lamp</button>
                        {{  btn1  }}
                    {%  endif  %}
                </form>

{%如果btn1==True%}

灯 {{btn1}} {%else%}
灯 {{btn1}} {%endif%}
为什么当我点击btn1时它的状态没有改变

谢谢,
James

实际上,您应该只使用json调用

flaskapp.py

from flask import Flask,render_template
import json
app = Flask(__name__)
def load_data(flat_file):
    try:
        return json.load(open(flat_file))
    except (IOError,ValueError):
        return {}
db_file = "my_data.json"

@app.route("/lamp/on")
def lamp_on():
    data = load_data(db_file)
    data["lamp"] = "on"
    json.dump(data,open(db_file,"wb"))
    return json.dumps(data)

@app.route("/lamp/off")
def lamp_off():
    data = load_data(db_file)
    data["lamp"] = "off"
    json.dump(data,open(db_file,"wb"))
    return json.dumps(data)

@app.route("/status")
def status():
    return load_data(db_file).get("lamp","off")
@app.route("/")
def main():
    return render_template("template.html")

if __name__ == "__main__":
    app.run(debug=True)
此应用程序将提供一个api来打开和关闭指示灯(显然,您需要做的不仅仅是写入文件)。以及位于“/”路线的可视仪表板

template.html

<head>
<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>
</head>
<body>
<div id="content">

</div>
</body>
<script>
    function OnButton(){
        var url = "/lamp/"+$("#lamp_btn").val().toLowerCase()
        $.get(url,update_button)
    }
    function update_button(){
        $.get("/status",function($data){
            var next_state = $data == "off"? "On":"Off"
            var button = $('<button id="lamp_btn" value="'+next_state+'">Turn Lamp '+next_state+'</button>')
            button.click(OnButton);
            $("#content").html(button)
        });
    }
    update_button();
</script>

函数OnButton(){
var url=“/lamp/”+$(“#lamp_btn”).val().toLowerCase()
$.get(url,更新按钮)
}
函数更新按钮(){
$.get(“/status”,函数($data){
var next_state=$data==“关闭”?“打开”:“关闭”
var按钮=$(“转向灯”+下一状态+“”)
按钮。单击(打开按钮);
$(“#内容”).html(按钮)
});
}
更新按钮();

这是一个仪表板,它只使用json调用api并只更新按钮(但您可以更新更多…这只是一个非常简单的示例)

因为在这两种情况下,您发送的是相同的消息…您还必须将btn1传递到模板中renderer@JoranBeasley您想详细说明一下吗?您需要调用
render\u模板(“my.html”,btn1=True)
渲染模板时,还必须将当前按钮状态存储在某种永久缓存中,因为它可能不会在连接之间持久存在,但这会使btn1每次都为真,如果为假呢?这个按钮是一个灯开关,灯不是一直亮着的,它会改变,因此它不可能一直是真的….?是的,你必须将它设置为正确的值True或false我刚才在示例中使用True来显示传递变量new template的样子