la requête ajax json directement au HTML généré par python devient indéfinie

Je lutte depuis trois semaines et je suis dans l’impasse. Les administrateurs système sont des développeurs de logiciels 🙂

J’essaie de créer des scripts python cgi-bin légers pour collecter des données et les convertir au format json. Ensuite, j’utilise une page HTML simple pour créer des requêtes ajax en scripts python afin d’obtenir des données et dessiner mes graphiques

Ceux-ci devraient être aussi légers que possible, car ils fonctionnent sur la framboise.

Un de mes scripts python qui collecte les données

#!/usr/bin/python import sqlite3 import gviz_api # enable debugging import cgitb cgitb.enable() def dict_factory(cursor, row): d = {} for idx, col in enumerate(cursor.description): d[col[0]] = row[idx] return d connection = sqlite3.connect("templog.db") connection.row_factory = dict_factory cursor = connection.cursor() cursor.execute("select temp, status from data where ID = (select MAX(ID) from data)") # fetch all or one we'll go for all. results = cursor.fetchall() connection.close() schema = {"temp": ("number", "temp"),"status": ("number", "status")} data = results # Loading it into gviz_api.DataTable data_table = gviz_api.DataTable(schema) data_table.LoadData(data) json = data_table.ToJSon(columns_order=("temp", "status"),order_by="temp") #print results #print "Content-type: application/json\n\n" print "Content-type: application/json" print print json 

Cela fonctionne comme un charme quand je l’ouvre sur mon navigateur et cela me donne ce dont j’ai besoin dans un format correct pour Google jsapi

 {"rows":[{"c":[{"v":21.062},{"v":0}]}],"cols":[{"type":"number","id":"temp","label":"temp"},{"type":"number","id":"status","label":"status"}]} 

Ci-dessous, mon code HTML nécessitant les données JSON du script Python pour dessiner le graphique.

        // Load the Visualization API and the piechart package. google.load('visualization', '1', {'packages':['corechart']}); // Set a callback to run when the Google Visualization API is loaded. google.setOnLoadCallback(drawTable); function drawTable() { var jsonData = $.ajax({ type: "GET", url: "http://192.168.1.123:8099/cgi-bin/test.py", dataType:"json", async: false }).responseText; alert(jsonData); // Create our data table out of JSON data loaded from server. var data = new google.visualization.DataTable(jsonData); // Instantiate and draw our chart, passing in some options. var chart = new google.visualization.LineChart(document.getElementById('chart_div')); chart.draw(data, {width: 400, height: 240}); }     

Malheureusement, j’ai reçu une alerte “non définie” lorsque HTML crée une requête ajax directement dans un script python.

Ensuite, j’ai copié la sortie JSON 1: 1 dans un fichier HTML statique et ai remplacé l’URL ajax par .html au lieu de .py dynamic, et cela fonctionne.

Ma question est la suivante: existe-t-il des limites à ce que j’essaie de faire ou y a-t-il un problème avec mon code?

Mon code est basé sur des exemples https://developers.google.com/chart/interactive/docs/php_example https://developers.google.com/chart/interactive/docs/dev/gviz_api_lib.

Si je lis correctement votre javascript, la propriété responseText n’est définie qu’une fois la requête terminée . Normalement, ces choses s’exécutent de manière asynchrone, vous enregistrez donc une fonction à appeler après la réception des données. par exemple

 function drawTable() { var drawChart = function(jsonData) { // Create our data table out of JSON data loaded from server. var data = new google.visualization.DataTable(jsonData); // Instantiate and draw our chart, passing in some options. var chart = new google.visualization.LineChart(document.getElementById('chart_div')); chart.draw(data, {width: 400, height: 240}); }; $.ajax({ type: "GET", url: "http://192.168.1.123:8099/cgi-bin/test.py", dataType:"json", async: false }).done(drawChart); } 

Vous trouverez plus d’exemples dans la documentation de jquery ajax .