[英]Passing JSON data to javascript from python
I'm trying to pass some data retrieved from a database with python to javascript.我正在尝试将从 python 的数据库中检索到的一些数据传递给 javascript。
The code below works.下面的代码有效。 I can access the data in javascript but I can only pass one row at a time.我可以访问 javascript 中的数据,但一次只能传递一行。
#!le/usr/bin/env python3
import sys
import re
import datetime
import sqlite3
import json
import time
SQLDB = '/home/daylene/db/PiLN.sqlite3'
db = sqlite3.connect(SQLDB)
db.row_factory = sqlite3.Row
cursor = db.cursor()
sql = '''SELECT segment, dt, set_temp, temp, pid_output
FROM firing WHERE run_id=? ORDER BY dt;
'''
p = ((54),)
cursor.execute(sql, p)
columns = [column[0] for column in cursor.description]
results = []
for row in cursor.fetchall():
results.append(dict(zip(columns,row)))
print(json.dumps(results[-1]))
And the working javascript和工作 javascript
<script>
$(document).ready(function () {
showGraph();
});
function showGraph()
{
$.ajax({
mimeType: 'application/json; charset=iso-8859-1',
url: 'data.cgi',
//data: JSON.stringify( query ),
contentType: "application/json",
dataType: 'json',
method: 'POST',
async: false,
success: function (response)
{
//document.write(response);
var time = response["dt"];
var temp = response["temp"];
//document.write(response);
//for (var i in response) {
// time.push(response.time);
// temp.push(response.temp);
//}
var chartdata = {
labels: time,
datasets: [
{
label: 'time',
backgroundColor: '#49e2ff',
borderColor: '#46d5f1',
hoverBackgroundColor: '#CCCCCC',
hoverBorderColor: '#666666',
data: temp
}
]
};
var graphTarget = $("#graphCanvas");
var barGraph = new Chart(graphTarget, {
type: 'bar',
data: chartdata
});
}
});
}
</script>
uncommentating document.write(response);
取消注释document.write(response);
and changing to print(json.dumps(results))
does not work.并更改为print(json.dumps(results))
不起作用。 Nothing is returned with document.write(response);
document.write(response);
Adding this does not work添加这个不起作用
for row in results:
results1.append(json.dumps(row))
print(results1)
and then adding this also does not work然后添加这个也不起作用
results1 = []
for row in results:
results1.append(json.dumps(row))
print(json.dump(results1)
The output of print(results)
(shortened) output print(results)
(缩短)
[{"segment": 4, "dt": "2020-07-09 19:58:55", "set_temp": 1145, "temp": 1145.02, "pid_output": 83.49}, {"segment": 4, "dt": "2020-07-09 19:59:24", "set_temp": 1145, "temp": 1145.15, "pid_output": 80.76}, {"segment": 4, "dt": "2020-07-09 19:59:54", "set_temp": 1145, "temp": 1145.16, "pid_output": 80.6}, {"segment": 4, "dt": "2020-07-09 20:00:24", "set_temp": 1145, "temp": 1145.15, "pid_output": 80.73}, {"segment": 4, "dt": "2020-07-09 20:00:55", "set_temp": 1145, "temp": 1145, "pid_output": 83.73}, {"segment": 4, "dt": "2020-07-09 20:01:24", "set_temp": 1145, "temp": 1145.08, "pid_output": 82.1}, {"segment": 4, "dt": "2020-07-09 20:01:54", "set_temp": 1145, "temp": 1145.13, "pid_output": 80.99}]
Any guidance is appreciated.任何指导表示赞赏。
The easiest way to serve data to your JS frontend from Python is by making a server that serves HTTP requests.从 Python 向 JS 前端提供数据的最简单方法是创建一个服务 HTTP 请求的服务器。
Using simple flask for example:以简单的 flask 为例:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/my-data")
def get_data():
my_data = [{"segment": 4, "dt": "2020-07-09 19:58:55"}, {}]
return jsonify(my_data)
if __name__ == "__main__":
app.run(port=8080, host="0.0.0.0")
And then you can request the data from http://localhost:8080/my-data
in your Javascript.然后你可以在你的 Javascript 中从http://localhost:8080/my-data
请求数据。
Bleh, I figured it out.呸,我想通了。 It wasn't the code but rather the size of the data I was trying to pass.这不是代码,而是我试图传递的数据的大小。 Trying a smaller array worked fine.尝试使用较小的阵列效果很好。
I finally thought to check the lighttpd logs and I'm getting this.我终于想到检查 lighttpd 日志,我明白了。
(mod_cgi.c.588) response headers too large for /app/data.cgi
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.