使用API​​将HTML表单数据转换为Flask脚本

时间:2018-06-19 16:32:15

标签: python api flask submit html-form-post

我正在尝试让我的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后。 (student.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>

Flask 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>

上面的flask脚本的问题在于,我可以将“ 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'} ]

但是,我对从哪里开始没有最模糊的想法,有人可以指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

您实际上并不需要两条路线,只需一条路线即可,因为它具有两种模式:

@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")