with scraping requests python json google-app-engine post

scraping - response request python



Pasando un objeto JSON a través de POST usando Python (3)

Estoy tratando de publicar un objeto JSON a través de un POST. Estoy tratando de hacerlo de la siguiente manera:

import json, urllib, urllib2 filename = ''test.json'' race_id = 2530 f = open(filename, ''r'') fdata = json.loads(f.read()) f.close() prefix = ''localhost:8000'' count = 0 for points in fdata[''positions''].iteritems(): print ''--'' + str(count) + ''--------'' url = ''http://''+prefix+''/api/points'' parameters = {''point_data'': json.dumps(points), ''race_id'': race_id} data = urllib.urlencode(parameters) print data request = urllib2.Request(url, data) response = urllib2.urlopen(request) count += 1 break; print ''Finished adding points''

Los datos se reciben en el otro extremo (estoy usando Google App Engine) con:

point_data = json.load(self.request.get(''point_data''))

Pero me sale el siguiente error:

ERROR 2010-06-30 15:08:05,367 __init__.py:391] ''unicode'' object has no attribute ''read'' Traceback (most recent call last): File "/home/ian/workspace/google_appengine/google/appengine/ext/webapp/__init__.py", line 513, in __call__ handler.post(*groups) File "/home/ian/workspace/codebase/track_builder/geo-api.py", line 276, in post point_data = json.load(self.request.get(''point_data'')) File "/home/ian/workspace/google_appengine/lib/django/django/utils/simplejson/__init__.py", line 208, in load return cls(encoding=encoding, **kw).decode(fp.read()) AttributeError: ''unicode'' object has no attribute ''read'' INFO 2010-06-30 15:08:05,376 dev_appserver.py:3266] "POST /api/points HTTP/1.1" 500 -

¿Alguna idea sobre cómo solucionar este problema?

EDITAR: como se solicita aquí es un ejemplo de los puntos:

(u''1276859700'', { u''24'': { u''tempc'': u''-22.7'', u''gpsq'': u''1'', u''altm'': u''65527'', u''hd'': u''112'', u''hdop'': u''0.93'', u''bton'': u''0'', u''maxv'': u''20.15'', u''idit'': u''1'', u''satc'': u''10'', u''minv'': u''20.15'', u''lat'': u''35.271993'', u''btusr'': u''0'', u''lng'': u''-121.845353'', u''knots'': u''7'' }, u''11'': { u''tempc'': u''13.0'', u''gpsq'': u''1'', u''altm'': u''65535'', u''hd'': u''130'', u''hdop'': u''0.84'', u''bton'': u''0'', u''maxv'': u''15.96'', u''idit'': u''1'', u''satc'': u''12'', u''minv'': u''15.88'', u''lat'': u''34.877815'', u''btusr'': u''0'', u''lng'': u''-121.386116'', u''knots'': u''8'' } }

EDITAR 2: Gracias a Daniel Roseman y Nick Johnson, que ambos entendieron mi error. He cambiado

point_data = json.loads(self.request.get(''point_data''))

Esto ha solucionado el error pero, ahora estoy recibiendo:

ERROR 2010-06-30 16:07:29,807 __init__.py:391] ''list'' object has no attribute ''iteritems'' Traceback (most recent call last): File "/home/ian/workspace/google_appengine/google/appengine/ext/webapp/__init__.py", line 513, in __call__ handler.post(*groups) File "/home/ian/workspace/codebase/track_builder/geo-api.py", line 255, in post for time, units in point_data.iteritems(): AttributeError: ''list'' object has no attribute ''iteritems'' INFO 2010-06-30 16:07:29,816 dev_appserver.py:3266] "POST /api/points HTTP/1.1" 500 -

que se relaciona con el siguiente código:

class TrackPoint(webapp.RequestHandler): def post(self): point_data = json.loads(self.request.get(''point_data'')) race_id = self.request.get(''race_id'') added = [] failed = [] for time, units in point_data.iteritems(): for unit, data in units.iteritems(): ...

¿Alguna idea sobre éste?


Parece que self.request.get() está devolviendo un objeto Unicode en lugar de un objeto similar a un archivo. Puedes intentar usar json.loads() lugar de json.load() .


json.load () espera un objeto de archivo, pero self.request.get devuelve el valor del parámetro como una cadena.

La solución es fácil: usar json.loads.

Además, consejo gratuito: supongo que a partir del nombre que está empaquetando su propia copia de la biblioteca json. App Engine en realidad incluye una copia de simplejson que puedes usar, solo hazlo:

from django.utils import simplejson


primero en js Reconozco que el objeto json debe estar en formato STRING (archivo javascript)

// using jquery, json2 var js = {"name":"nguyen","age":"1"}; $.post("/", {''data'': JSON.stringify(js)}, function(ret){ alert(ret); });

entonces en gae

from django.utils import simplejson as json class PesonReq(webapp.RequestHandler): def post(self): t = json.loads(self.request.POST[''data'']) self.response.out.write(t[''name''])