Uso la bottiglia per ricevere il webhook POST da bitbucket. Il corpo del POST contiene informazioni su ciò che è cambiato nel repository, ecc. Sono in grado di farlo bene con @post('/myroute')
, tuttavia ho problemi ad arrivare al testo dei dati del corpo POST.come ottenere il testo del corpo della richiesta usando la bottiglia?
Ecco un'immagine che mostra quello che sto facendo un capo all'altro http://i.imgur.com/rWc7Hry.png
Quando stampata a consolare request.body
rendimenti:
StringIO.StringIO instance at 0x7fa13341c4d0
e request.body.dir()
rendimenti:
AttributeError: StringIO instance has no attribute 'dir'
I Mi chiedo come posso arrivare al testo attuale del corpo della richiesta (o ispezionare l'oggetto in qualche modo trovare lo stesso)?
la richiesta POST corpo sarà simile a questo:
Ho anche provato request.json
(senza fortuna)
qualche consiglio?
EDIT: ho finito per usare questo:
from bottle import get, post, request, run
import urllib
import json
@post('/bitbucket')
def postToJSON():
body = request.body.read()
body = body.replace("+","").replace("payload=","")
parsedBody = urllib.unquote(body).decode('utf8')
print parsedBody
jsonObj = json.loads(parsedBody)
print jsonObj
interessante ora, parsedBody sembra buono:
{"repository":{"website":null,"fork":false,"name":"test","scm":"git","owner":"
testName","absolute_url":"/testNameTest/test/","slug":"test","is_private":true},"trunc
ated":false,"commits":[{"node":"04554d6980dd","files":[{"type":"modified","file"
:"stacker.py"}],"raw_author":"TestName<[email protected]>","utctimestamp":"
2015-05-2815:30:03+00:00","author":"testName","timestamp":"2015-05-2817:30:03","
raw_node":"04554d6980dd3c5fe4c3712d95b49fcf9b8da4f4","parents":["7f98b4e7532e"],
"branch":"master","message":"foo\n","revision":null,"size":-1}],"canon_url":"htt
ps://bitbucket.org","user":"testName"}
ma jsonObj non è così buono:
{u'commits': [{u'node': u'7f98b4e7532e', u'files': [{u'type': u'modified', u'fil
e': u'stacker.py'}], u'branch': u'master', u'utctimestamp': u'2015-05-2815:24:50
+00:00', u'author': u'TestName', u'timestamp': u'2015-05-2817:24:50', u'raw_node
': u'7f98b4e7532e02d53d83a29ec2073c5a5eac58c8', u'parents': [u'019e77d2e0d3'], u
'raw_author': u'TestNamer<[email protected]>', u'message': u'foo\n', u'size'
: -1, u'revision': None}], u'user': u'TestName', u'canon_url': u'https://bitbuck
et.org', u'repository': {u'website': None, u'fork': False, u'name': u'test', u's
cm': u'git', u'absolute_url': u'/ericTest/test/', u'owner': u'TestName', u'slug'
: u'test', u'is_private': True}, u'truncated': False}
tuttavia, quando faccio qualcosa come
print jsonObj['repository']['name']
funziona come previsto (si limita a stampare il nome di 'test')
ho fatto arrivare a https://docs.python.org/2/library/stringio.html prima di pubblicare, ma l'utilizzo non è stato ovvio per me, e non vedo read() su quella pagina (sembra che funzioni bene). La stringa restituita da read() restituisce comunque una codifica molto brutta, tutto "e {sono sostituiti con% 22% 2C +% 22. C'è un modo elegante per ingerirlo come json, o forse un metodo stringio> json? cercando di evitare di analizzarlo con la manipolazione del testo .... – 3z33etm
@ 3z33etm La documentazione di StringIO suggerisce di leggere la documentazione dell'oggetto-file.Ma sì, un esempio per la lettura sarebbe bello. Presenta un problema;) Riguardo ai problemi di codifica: è probabilmente una forma di urlencoding, che può essere decodificata usando i moduli urllib o cgi. Dai un'occhiata agli header della richiesta. Questo potrebbe essere il motivo per cui 'request.json' non funziona. – deets
grazie, buone informazioni. – 3z33etm