python - 使用 API 将 HTML 表单数据转换为 Flask 脚本
问题描述
我试图让我的 python 脚本在下面作为一个动态 Web 应用程序工作,该应用程序使用 HTML 表单让用户输入某个停车场号码,然后返回有关基于政府的给定停车场可用地段数量的信息- 网站的 API。
Python脚本:
import requests
import json
# Do the HTTP get request
response = requests.get("https://api.data.gov.sg/v1/transport/carpark-availability")
jack = response.json()
daniel = jack['items'][0]["carpark_data"]
for d in daniel:
if d["carpark_number"] == carpark_No:
print("\nFor Carpark No. " + carpark_No + ":\n")
print(d["carpark_info"])
我希望变量“carpark_No”成为 HTML 表单中的 user_inputted 值。
例如,如果我将“carpark_No”设置为“HG55”,则此脚本的输出将是:
For Carpark No. HG55:
[ { 'total_lots': '82' , 'lot_type': 'C', 'lots_available': '79'} ]
但是,正如您可能已经猜到的那样,这个 python 脚本完全基于终端。我希望它作为一个动态网络应用程序工作,允许用户从 API 返回停车场信息。我研究了 Flask 并设法在 localhost 上进行以下工作。
主要烧瓶应用程序:
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def student():
return render_template('student.html')
@app.route('/result',methods = ['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("result.html",result = result)
if __name__ == '__main__':
app.run(debug = True)
Flask App1: # 在启动上面的 python 脚本并在浏览器上打开 localhost:5000 之后。(学生.html)
<!doctype html>
<html>
<body>
<form action = "http://localhost:5000/result" method = "POST">
<p>Carpark No: <input type = "text" name = "Carpark" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
</body>
</html>
烧瓶 App2:(result.html)
<!doctype html>
<html>
<body>
<table border = 1>
{% for key, value in result.items() %}
<tr>
<th> {{ key }} </th>
<td> {{ value }} </td>
</tr>
{% endfor %}
</table>
</body>
</html>
上面烧瓶脚本的问题是我可以将“Carpark_No”的值插入为“HG55”,它完美地返回了表格中的数据,但这不是我想要的。
我想更改我的 Main Flask App 脚本,使“/results”处的最终页面成为我一开始为我准备的 Python 脚本的呈现页面。
换句话说,我想使用我在 student.html 中提交的表单中的数据并将其插入我的第一个 Python 脚本中,这样我就会得到如下输出:
For Carpark No. HG55: # should be dynamic data that can be changed from student.html or Flask App 1
[ { 'total_lots': '82' , 'lot_type': 'C', 'lots_available': '79'} ]
但是,我一点也不知道从哪里开始,有人能指出我正确的方向吗?
解决方案
你真的不需要两条路线,可以只使用一条,因为它有两种模式:
@app.route('/',methods = ['POST', 'GET'])
def main():
if request.method == 'POST':
result = request.form
return render_template("result.html", result=result)
else:
return render_template("student.html")
然后您可以将表单发布回主要路线,
<form action = "{{ url_for('main') }}" method="POST">
<p>Carpark No: <input type = "text" name = "Carpark" /></p>
<p><input type = "submit" value = "submit" /></p>
</form>
但是,您的问题是您只是在回收表单输入数据并将其传递给 result.html。相反,您希望处理类似于脚本的表单输入数据,然后返回处理后的数据:
import requests
import json
@app.route('/',methods = ['POST', 'GET'])
def main():
if request.method == 'POST':
data = request.form
# do your original script
response = requests.get("https://api.data.gov.sg/v1/transport/carpark-availability")
jack = response.json()
daniel = jack['items'][0]["carpark_data"]
# cross reference against form input
result = {'Carpark No.': data['Carpark']}
for d in daniel:
if d["carpark_number"] == data['Carpark']:
result.update({'Carpark Info': d["carpark_info"]})
return render_template("result.html", result=result)
else:
return render_template("student.html")
推荐阅读
- react-native - Android scrollview 不滚动并切断文本
- mysql - 使用 SELECT COUNT(*) 使用 SKIP 值限制
- python - Pytube 只能定期工作(KeyError: 'assets')
- typescript - 如何在 vue.js 中使用动态表行跨度?
- google-cloud-dataflow - 从 Python 云函数调用数据流弹性模板时出错
- r - Ivpack 和 Stargazer 的问题
- python - 按 2 列分组,计算第三个数值列的分位数
- javascript - 使用 Snowflake 中的存储过程从表中检索两列
- python - PyCharm 中的“需要更多值来解压”警告
- verilog - 使用测试向量文件的 ALU 测试台不工作