python - 在 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/on和http://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>
我正在就上述情况寻求帮助。有什么解决方法吗?提前致谢。
解决方案
可能最简单的做法是在用户单击按钮时从前端触发 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 后端,您可以继续使用相同的结构,而无需使用表单。
推荐阅读
- c# - 如何比较对象
- java - “SQLiteDatabase.insert(TABLE_NAME,null,ContentValues);” 显示“数据类型不匹配”错误
- r - 是否可以垂直调整闪避条形图中的标签?
- python - Python中的操作顺序
- javascript - 将参数传递给函数
- reactjs - 如何将带有 styled-components 的样式应用于包装在 Material UI 网格中的组件?
- .net - 操作系统如何调用用户计划的任务来执行?
- javascript - Javascript 函数返回 undefined 即使值存在
- java - 为什么这段代码会导致堆栈溢出?为什么只需将 ==1 更改为 <2,然后它就可以工作了?
- c# - 淘汰赛 JS 选择初始值在 foreach 循环内未正确显示