Seite 1 von 1
[bottle] json data request
Verfasst: Montag 7. Mai 2012, 13:33
von christKIN_D
Ich wollte mal
bottle.py mit
jQuery&Ajax ausprobieren, darum habe ich mein Setup so minimal aufgebaut wie möglich.
Dictionarys werden von bottle automatisch als Typ 'application/json' ausgeliefert, das funktioniert auch. Wenn ich mein javascript ausführe, geht auch ein request an meinen bottle-server. Aber statt
alert('whoooo es geht'), lande ich immer beim error. Was mache ich falsch?
Code: Alles auswählen
@route('/json/test')
def show_json():
return {'TestA':'Ich bin Test A.', 'TestB':'Ich bin Test B.'}
Code: Alles auswählen
<script type="text/javascript">
$.ajax({
type: "GET",
url: "http://127.0.0.1:8080/json/test",
dataType: 'json',
success: function(data){
alert('whoooo es geht');
},
error: function(o,c,m) { alert(m); }
});
</script>
Code: Alles auswählen
Bottle v0.11.dev server starting up (using WSGIRefServer())...
Listening on http://127.0.0.1:8080/
Hit Ctrl-C to quit.
localhost - - [07/May/2012 14:17:28] "GET /json/test HTTP/1.1" 200 56
localhost - - [07/May/2012 14:19:32] "GET /json/test HTTP/1.1" 200 56
Re: [bottle] json data request
Verfasst: Montag 7. Mai 2012, 15:04
von frabron
Du möchtest dir mal das JSON Modul ansehen

denn dein Dict ist kein valides JSON (' vs "), trotz des richtigen Headers.
EDIT
Sowas kann man auch prima mit FireBug (Firefox Extension) herausfinden ...
Re: [bottle] json data request
Verfasst: Montag 7. Mai 2012, 15:11
von nomnom
Klar ist das valides JSON …
Das Problem ist möglicherweise die „Same-Origin-Policy“.
Wenn du deine HTML-Datei über Bottle auslieferts funktionierts:
Code: Alles auswählen
from bottle import route, run, static_file
@route('/')
def index():
return static_file("test.html", root='.')
@route('/json/test')
def show_json():
return {'TestA':'Ich bin Test A.', 'TestB':'Ich bin Test B.'}
run(host='localhost', port=8080)
Re: [bottle] json data request
Verfasst: Montag 7. Mai 2012, 16:00
von christKIN_D
Danke nomnom! An so etwas wie eine „Same-Origin-Policy“ hatte ich nicht gedacht.
Re: [bottle] json data request
Verfasst: Dienstag 8. Mai 2012, 12:27
von frabron
nomnom hat geschrieben:Klar ist das valides JSON …
Klar ist nur, dass das kein valides JSON ist. Bloss weil es geht ist das noch lange nicht richtig. Wie ich oben schon schrieb, müssen Zeichenketten für JSON in "Double-Quotes" stehen. Sich auf die automatische Umwandlung von dict nach str zu verlassen ist fahrlässig. Deshalb sollte man vor der Respone explizit seine Daten JSON-kompatibel machen. Nur noch mal zur Verdeutlichung:
Code: Alles auswählen
>>> json.dumps({'a':'b', 'c':'d'})
'{"a": "b", "c": "d"}'
Jaja, ich weiss, pingelig, aber nicht jeder JSON Parser akzeptiert Singlequotes
Code: Alles auswählen
>>> json.loads("{'a':'b', 'c':'d'}")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/local/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/lib/python2.7/json/decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting property name: line 1 column 1 (char 1)
>>> json.loads('{"a":"b", "c":"d"}')
{u'a': u'b', u'c': u'd'}
Re: [bottle] json data request
Verfasst: Dienstag 8. Mai 2012, 12:41
von deets
frabron hat geschrieben:nomnom hat geschrieben:Klar ist das valides JSON …
Klar ist nur, dass das kein valides JSON ist. Bloss weil es geht ist das noch lange nicht richtig.
Stimmt nicht. Du verwechselst Python-Literale mit der JSON-encodierung. Der OP hat eine *PYTHON* Struktur zurueckgegeben, und bottle wandelt das automatisch. Da ist auch nix "fahrlaessiges" dran - im Gegenteil, das von Hand zu machen ist boiler-plate & fehleranfaelliger. Natuerlich muss man sicherstellen, dass der JSON-serialisierer auch alle Objekte serialisieren kann. Aber das muss man beim expliziten dumps ja auch...
Re: [bottle] json data request
Verfasst: Donnerstag 10. Mai 2012, 07:51
von frabron
Mir war nicht bewusst, dass Bottle sowas automatisch macht, aber ich habe grade die entsprechende
Stelle in der Dokumentation gefunden. Das habe ich dann wohl mit Flask ein wenig durcheinander gebracht, wo man explizit JSON mittels flask.jsonify zurückgeben muss ...