2012-07-31 13 views
9

Sto cercando di scoprire come creare una connessione locale tra un server Python e un client Javascript utilizzando il formato JSON per i dati da recuperare. In particolare, ho bisogno di fare alcune query sul lato client HTML, inviare queste query al server in formato JSON ed eseguirle sul lato server Python per cercare dati su un database SQLite. E dopo aver ottenuto i risultati dal database, inviare questi risultati al client anche in formato JSON.Come connettere Javascript a Python per condividere i dati con il formato JSON in entrambi i modi?

Ormai, ho appena possibile eseguire la query su Python e il codice su JSON come questo:

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) 

So che questo codice fa qualcosa di simile (in realtà si corre), perché si chiama un servizio su un server che restituisce i dati in formato JSON (ma il server in questo esempio non è Python):

<html> 
    <head> 
     <style>img{ height: 100px; float: left; }</style> 
     <script src="http://code.jquery.com/jquery-latest.js"></script> 
    </head> 
    <body> 
     <div id="images"></div> 
    <script> 
     $.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){ 
      $("<img/>").attr("src", item.media.m).appendTo("#images"); 
      if (i == 3) return false; 
     }); 
     });</script> 

    </body> 
</html> 

cosa ho bisogno è di sapere come avrei dovuto correre (a livello locale) il programma python per essere una corsa disponibile su web servizio e come dovrebbe essere il Javascript per recuperare i dati dal server python.

Ho cercato su Internet ovunque, ma non ho trovato questa risposta da nessuna parte perché le uniche risposte che danno sono su come codificare JSON all'interno di Python o all'interno di Javascript ma non collegandole entrambe. Spero che qualcuno possa aiutarmi in questo !!!

+1

Potresti essere interessato a [il framework Pico] (https://github.com/fergalwalsh/pico) (sì, sono un contributore, ma questo non lo rende meno bene). Funziona davvero bene. –

+0

Probabilmente dovresti accettare una risposta. – Marcin

risposta

3

ho trovato finalmente un modo più semplice di quanto Flask. È un framework Python chiamato Bottle Devi solo scaricare la libreria dal sito web ufficiale e mettere tutti i suoi file nella tua directory di lavoro per importare la libreria. Puoi anche installarlo usando il programma di installazione python incluso per evitare di trasportare con il codice sorgente ovunque.Poi, per rendere il vostro servizio Web Server è possibile codificare in questo modo:

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 "<h1>This is an example of web page</h1><hr/><h2>Hope you enjoy it!</h2>" 

#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 (<parameter_name>) 
@route('/dataQuery/<name>/<age>') 
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/<filename:re:.*\.jpg>') 
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) 

Infine, è possibile chiamare il servizio web resto della tua app Bottlepy su un client JavaScript in questo modo:

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= "<table border='2' bordercolor='#397056'><tr><td><strong>name</strong></td><td><strong>age</strong></td></tr>"; 
     $.each(myRes, function(i, element){ 
      toStore= toStore+ "<tr><td>"+element.name+"</td><td>" + element.age+ "</td></td></tr>"; 
     }) 
     toStore= toStore+ "</table>" 
     $('#theDataDiv').text(''); 
     $('<br/>').appendTo('#theDataDiv'); 
     $(toStore).appendTo('#theDataDiv'); 
     $('<br/>').appendTo('#theDataDiv'); 
    }) 
} 

Spero possa essere utile per qualcun altro

+3

E cosa rende la bottiglia più facile della fiaschetta? – Marcin

7

La tua domanda equivale a "come faccio a trasformare questo python in un webservice".

Probabilmente i modi più leggeri per fare ciò sono web.py e flask. Dategli un'occhiata

Se questo è più grande, si consideri django con tastypie - questo è un modo semplice per creare una API basata su json.

Aggiornamento: Apparentemente, esiste anche un framework RPC python-javascript denominato Pico, a cui Felix Kling è un contributore. L'intro dice:

Letteralmente aggiungere una riga di codice (pico importazione) al modulo Python per trasformarlo in un servizio web che è accessibile attraverso il Javascript (e Python) libararies client Pico.

9

Ecco un "ciao mondo" esempio di a flask web-application che può servire HTML statico e file JavaScript, database di ricerca con il parametro da una richiesta di javascript, e restituire i risultati a JavaScript come 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 e.g., 
    # twistd -n web --wsgi=hello_world.application --port tcp:5001:interface=localhost 

Il database il codice di installazione è da Using SQLite 3 with Flask.

static/page.html e static/json-jquery.js file sono da Ajax/jQuery.getJSON Simple Example, in cui il codice javascript è leggermente modificato per passare un URL diverso e il parametro nitems:

$(document).ready(function(){ 
    $('#getdata-button').live('click', function(){ 
     $.getJSON('/json-data', {'nitems': 3}, function(data) { 
      $('#showdata').html("<p>item1="+data.item1+" item2="+data.item2+" item3="+data.item3+"</p>"); 
     }); 
    }); 
}); 
+0

Mi spiace far apparire vecchi thread. Ho solo una domanda. Non ci sono implicazioni sulla sicurezza semplicemente prendendo gli argomenti e alimentandoli direttamente nel database? Non sono critico; solo curiosità Sto cercando di capire come funziona JSON. Qualcuno può chiamare su questa API quindi renderlo soggetto agli attacchi di injection sql? –

+1

@FlorinStingaciu: È una query parametrizzata. Il motore sfugge a tutti gli argomenti. – jfs

Problemi correlati