2015-05-27 18 views
5

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:

http://pastebin.com/SWjLrHig

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

risposta

5

Come afferma documentazione bottiglia, i dati di richiesta è "un file come oggetto". http://bottlepy.org/docs/dev/tutorial.html#the-raw-request-body

Così si accede al corpo grezzo utilizzando read().

Inoltre, dir non è un metodo di oggetti , è una funzione indipendente, che si chiama passando un oggetto.

dir(request.body) 

E googling per StringIO Se avete portato qui: https://docs.python.org/2/library/stringio.html

+0

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

+0

@ 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

+0

grazie, buone informazioni. – 3z33etm