¿Cómo conectar Javascript a Python para compartir datos con el formato JSON de ambas maneras?

Estoy tratando de descubrir cómo crear una conexión local entre un servidor Python y un cliente Javascript utilizando el formato JSON para recuperar los datos. Particularmente, necesito hacer algunas consultas en el lado del cliente HTML, enviar estas consultas al servidor en formato JSON y ejecutarlas en el lado del servidor Python para buscar datos en una base de datos SQLite. Y después de obtener los resultados de la base de datos, envíe esos resultados al cliente en formato JSON también.

Por ahora, solo puedo ejecutar la consulta en Python y codificarla en JSON de esta manera:

import sqlite3 as dbapi import json connection = dbapi.connect("C:/folder/database.db") mycursor = connection.cursor() mycursor.execute("select * from people") results = [] for information in mycursor.fetchall(): results += information onFormat = json.dumps(results) print(onFormat) 

Sé que este código hace algo parecido (de hecho se ejecuta), porque llama a un servicio en un servidor que devuelve datos en formato JSON (pero el servidor en este ejemplo NO es Python):

   img{ height: 100px; float: left; }    
$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", { tags: "mount rainier", tagmode: "any", format: "json" }, function(data) { $.each(data.items, function(i,item){ $("").attr("src", item.media.m).appendTo("#images"); if ( i == 3 ) return false; }); });

Lo que necesito es saber cómo debo ejecutar (localmente) el progtwig python para ser un servicio web en ejecución disponible y cómo debería ser el Javascript para recuperar los datos del servidor de python.

Lo busqué en Internet en todas partes, pero no encontré esta respuesta en ninguna parte porque las únicas respuestas que brindan son cómo codificar JSON dentro de Python o dentro de Javascript, pero no conectar ambas. Espero que alguien me pueda ayudar en esto !!!

Aquí hay un ejemplo de “hola mundo” de una aplicación web de flask que puede servir archivos estáticos html y javascript, buscar en la base de datos usando un parámetro de una solicitud javascript y devolver los resultados a javascript como json:

 import sqlite3 from flask import Flask, jsonify, g, redirect, request, url_for app = Flask(__name__) @app.before_request def before_request(): g.db = sqlite3.connect('database.db') @app.teardown_request def teardown_request(exception): if hasattr(g, 'db'): g.db.close() @app.route('/') def index(): return redirect(url_for('static', filename='page.html')) @app.route('/json-data/') def json_data(): # get number of items from the javascript request nitems = request.args.get('nitems', 2) # query database cursor = g.db.execute('select * from items limit ?', (nitems,)) # return json return jsonify(dict(('item%d' % i, item) for i, item in enumerate(cursor.fetchall(), start=1))) if __name__ == '__main__': app.run(debug=True, host='localhost', port=5001) # http://localhost:5001/ else: application = app # for a WSGI server eg, # twistd -n web --wsgi=hello_world.application --port tcp:5001:interface=localhost 

El código de configuración de la base de datos es de Usar SQLite 3 con Flask .

static/page.html y static/json-jquery.js son de Ajax / jQuery.getJSON. Ejemplo simple , en el que el código javascript se modifica ligeramente para pasar un parámetro diferente de URL y nitems :

 $(document).ready(function(){ $('#getdata-button').live('click', function(){ $.getJSON('/json-data', {'nitems': 3}, function(data) { $('#showdata').html("

item1="+data.item1+" item2="+data.item2+" item3="+data.item3+"

"); }); }); });

Tu pregunta equivale a “¿Cómo puedo hacer que este python se convierta en un servicio web”?

Probablemente las formas más ligeras de hacerlo son web.py y flask . Echa un vistazo a ellos.

Si esto es cada vez más grande, considere django con tastypie – esa es una manera simple de hacer una api basada en json.

Actualización: al parecer, también hay un marco RPC de python-javascript llamado Pico , en el que Felix Kling es un colaborador. La introducción dice:

Agregue literalmente una línea de código (importar pico) a su módulo de Python para convertirlo en un servicio web al que se pueda acceder a través de las bibliotecas de los clientes Javascript (y Python) Pico.

Finalmente encontré una manera más fácil que Flask. Es un marco de Python llamado Bottle . Solo necesita descargar la biblioteca del sitio web oficial y colocar todos sus archivos en el directorio de trabajo para importar la biblioteca. También puede instalarlo usando el progtwig de instalación de python incluido para evitar llevar el código fuente a todas partes. Luego, para hacer su Servidor de Servicios Web puede codificarlo así:

 from bottle import hook, response, route, run, static_file, request import json import socket import sqlite3 #These lines are needed for avoiding the "Access-Control-Allow-Origin" errors @hook('after_request') def enable_cors(): response.headers['Access-Control-Allow-Origin'] = '*' #Note that the text on the route decorator is the name of the resource # and the name of the function which answers the request could have any name @route('/examplePage') def exPage(): return "

This is an example of web page


Hope you enjoy it!

" #If you want to return a JSON you can use a common dict of Python, # the conversion to JSON is automatically done by the framework @route('/sampleJSON', method='GET') def mySample(): return { "first": "This is the first", "second": "the second one here", "third": "and finally the third one!" } #If you have to send parameters, the right sintax is as calling the resoure # with a kind of path, with the parameters separed with slash ( / ) and they # MUST to be written inside the lesser/greater than signs ( ) @route('/dataQuery//') def myQuery(name,age): connection= sqlite3.connect("C:/folder/data.db") mycursor = connection.cursor() mycursor.execute("select * from client where name = ? and age= ?",(name, age)) results = mycursor.fetchall() theQuery = [] for tuple in results: theQuery.append({"name":tuple[0],"age":tuple[1]}) return json.dumps(theQuery) #If you want to send images in jpg format you can use this below @route('/images/') def send_image(filename): return static_file(filename, root="C:/folder/images", mimetype="image/jpg") #To send a favicon to a webpage use this below @route('/favicon.ico') def favicon(): return static_file('windowIcon.ico', root="C:/folder/images", mimetype="image/ico") #And the MOST important line to set this program as a web service provider is this run(host=socket.gethostname(), port=8000)

Finalmente, puede llamar al servicio web REST de su aplicación Bottlepy en un cliente Javascript de esta manera:

 var addr = "192.168.1.100" var port = "8000" function makeQuery(name, age){ jQuery.get("http://"+addr+":"+port+"/dataQuery/"+ name+ "/" + age, function(result){ myRes = jQuery.parseJSON(result); toStore= ""; $.each(myRes, function(i, element){ toStore= toStore+ ""; }) toStore= toStore+ "
nameage
"+element.name+"" + element.age+ "
" $('#theDataDiv').text(''); $('
').appendTo('#theDataDiv'); $(toStore).appendTo('#theDataDiv'); $('
').appendTo('#theDataDiv'); }) }

Espero que pueda ser de utilidad para otra persona.