【发布时间】:2018-07-15 07:18:06
【问题描述】:
我想以DataTable 的形式显示一个表格 - 这是一个 pandas 数据框。在下面的简化示例中,我读取了用户提供的两个数字,它们确定了表格的行号和列号。该表的元素数量随后会正确显示,但是该表没有出现。
我认为问题在于我以错误的方式传递表格。当我尝试时
return jsonify(number_elements=a * b,
my_table=df)
我得到了错误
anaconda2/lib/python2.7/json/encoder.py",第 184 行,默认 raise TypeError(repr(o) + " is not JSON serializable")
类型错误:0 1 2 3 0 51 35 10 84 1 30 60 79 24 不是 JSON 可序列化
如果我使用
return jsonify(number_elements=a * b,
my_table=df.to_json())
那么没有错误但表格仍然没有显示。
我该如何正确地做到这一点?
我的index.html 文件如下所示:
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<link href="https://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css"
rel="stylesheet">
<link href="https://cdn.datatables.net/1.10.16/css/jquery.dataTables.min.css"
rel="stylesheet">
<script type=text/javascript>
$(function() {
$('a#calculate').bind('click', function() {
$.getJSON('/_get_table', {
a: $('input[name="a"]').val(),
b: $('input[name="b"]').val()
}, function(data) {
$("#elements").text(data.number_elements);
$("#a_nice_table").DataTable(data.my_table);
});
return false;
});
});
</script>
</head>
<body>
<div class="container">
<div class="header">
<h3 class="text-muted">Create a pretty table</h3>
</div>
<div>
<p>Number of rows</p>
<input type="text" size="5" name="a" value="2">
<p>Number of columns</p>
<input type="text" size="5" name="b" value="4">
<p><a href="javascript:void();" id="calculate">get a pretty table</a></p>
<p>Result</p>
<p>Number of elements:</p>
<span id="elements">Hallo</span><br>
<span id="a_nice_table">Here should be a table</span>
</div>
</div>
</body>
</html>
我的文件app.py 看起来像这样:
from flask import Flask, render_template, request, jsonify
import pandas as pd
import numpy as np
# Initialize the Flask application
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/_get_table')
def get_table():
a = request.args.get('a', type=int)
b = request.args.get('b', type=int)
df = pd.DataFrame(np.random.randint(0, 100, size=(a, b)))
return jsonify(number_elements=a * b,
my_table=df)
if __name__ == '__main__':
app.run(debug=True)
【问题讨论】:
标签: python jquery pandas flask datatables