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''])