将Flask JSON响应作为HTML表获取?

时间:2018-04-22 09:12:21

标签: python json csv flask html-table

我想知道是否有办法将我的Flask应用程序的响应作为由JSON响应键值对填充的HTML表而不是仅仅在HTML页面上包含整个JSON字符串?

以下是我的代码:

from flask import Flask
import json, pandas as pd

app = Flask(__name__)

@app.route("/GetData")
def GetData():
    df = pd.read_csv("DemoData.csv")
    temp = df.to_dict('records')
    data = [dict(i) for i in temp]
    return json.dumps(data, indent=4)


if __name__ == "__main__":
    app.run(host='127.0.0.1', port=8000)

上面的代码给出了以下回复:(URL:“http://127.0.0.1:8000/GetData”)

current output

现在我想要的是在输入上述URL时将响应转换为表格,如CSV文件。

以下是我的CSV文件示例:

Employee Name,City,Country,Project Assigned
Carl Elias,Passadena,USA,Optical Character Recognition
Amanda Jean Spears,Denver,USA,Linux Kali Security Mods
John Reese,Athens,Greece,Inertial Navigation System
Leslie James,Heartfordshire,United Kingdom,Relay Transmission Optimisation Mods
Patrick Sullivan,London,United Kingdom,Fraud Checking System
Julia Reginald Roberts,Sao Paolo,Brazil,User Authentication System
Michael Bucannan,San Franscisco,USA,Analytics Automation Tool
Jeanine Fitzgerald,Ontario,Canada,CopyChecker
Patricia Sullly,Shanghai,China,Automated Milling Tool

2 个答案:

答案 0 :(得分:2)

你应该像Alex Hall所说的那样为它写一个模板。 如果循环遍历列名,它将不会被硬编码。 首先,您应该导入render_template。

from flask import Flask, render_template

然后,您需要更改请求处理程序。这允许呈现模板' record.html'注入两个变量,记录和共同名称。

@app.route("/GetData")
def GetData():
    df = pd.read_csv("DemoData.csv")
    temp = df.to_dict('records')
    columnNames = df.columns.values
    return render_template('record.html', records=temp, colnames=columnNames)

Check this rendering template guide.您需要创建一个新文件夹' templates /',您可以找到' templates / record.html'下面:

<table border="1">
    <thead>
        <tr>
            {% for col in colnames %}
            <th>{{ col }}</th>
            {% endfor %}
        </tr>
    </thead>
    <tbody>
        {% for record in records %}
        <tr>
            {% for col in colnames %}
            <td>{{ record[col] }}</td>
            {% endfor %}
        </tr>
        {% endfor %}
    </tbody>
</table>

要动态执行此操作,首先应迭代列名。正如Alex Hall所说,dict没有被排序,因此在迭代记录时,你还应该迭代列名,这样你就可以按正确的顺序编写它们。

答案 1 :(得分:0)

一个非常简单的技巧是先将数据读入 Pandas 数据帧,然后调用 .to_html:

import pandas as pd
from flask import Flask, render_template

@app.route("/table-page", methods=['GET'])
def table():

    data_dic = {
        'id': [100, 101, 102],
        'color': ['red', 'blue', 'red']}
    columns = ['id', 'color']
    index = ['a', 'b', 'c']

    df = pd.DataFrame(data_dic, columns=columns, index=index)
    table = df.to_html(index=False)
    
    return render_template(
        "at-leaderboard.html",
        table=table)

然后简单地将 HTML 弹出到您的模板中:

<html>
  <body>
    <div>
      {{ table | safe }}
    </div>
  </body>
</html>