首页 > 解决方案 > 在 Flask 中将 GET 方法转换为 POST 方法

问题描述

我正在构建一个简单的网络应用程序来控制我的 Raspberry Pi 中的 LED。

我对它们有一个路由和函数调用,如下所示:

@app.route("/<pin>/<action>")
def action(pin, action):
    if pin == "pin1" and action == "on":
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.LOW)

    if pin == "pin1" and action == "off":
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.HIGH)

默认情况下,Flask 认为它是 GET 方法,我在 HTML 文件中使用带有锚标记的 href 来传递 pin 和操作。

<button><a href="/pin1/on">ON</a></button>
<button><a href="/pin2/off">Off</a></button>

这可以很好地打开关闭 LED,但它会在单击按钮后更改 URL。例如http://0.0.0.0/pin1/onhttp://0.0.0.0/pin1/off

我不想更改 URL,因此建议使用表单元素在按钮中使用操作和名称来使用 POST 方法。所以,我尝试了以下但它不起作用。Python代码是

@app.route("/pinstatus", methods=['POST'])
def pinstatus():
    if request.form['lighton']:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.LOW)

    if request.form['lightoff']:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(3, GPIO.OUT)
        GPIO.output(3, GPIO.HIGH)

HTML 代码

<form action="{{ url_for('pinstatus') }}" method="POST">    
    <button name="lighton">ON</button>
    <button name="lightoff">Off</button>
</form>

我正在就上述情况寻求帮助。有什么解决方法吗?提前致谢。

标签: pythonflaskraspberry-pi

解决方案


可能最简单的做法是在用户单击按钮时从前端触发 XHR。

例如: <button><a onclick='pinAction("/pin1/on");'>ON</a></button>

然后在JS中做:

<script>
function pinAction(endpoint) {
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", endpoint, false ); // false for synchronous request
    xmlHttp.send();
    console.log(xmlHttp.responseText); // Maybe send a 200 reply
    return false; // So the default is prevented.
}
</script>

然后在 Flask 后端,您可以继续使用相同的结构,而无需使用表单。


推荐阅读