2015-05-27 12 views
5

Używam butelki do odbioru POST webhook z bitbucket. Treść POST zawiera informacje o tym, co zmieniło się w repo, itp. Mogę to zrobić dobrze z @post('/myroute'), ale mam problem z dostaniem się do rzeczywistego tekstu danych POST.jak zdobyć tekst na żądanie za pomocą butelki?

tutaj jest obraz, który pokazuje, co robię od końca do końca http://i.imgur.com/rWc7Hry.png

Gdy drukowane pocieszyć request.body plonów:

StringIO.StringIO instance at 0x7fa13341c4d0

i request.body.dir() plonów:

AttributeError: StringIO instance has no attribute 'dir'

I Zastanawiam się, jak dostać się do faktycznego tekstu organu wnioskującego (lub jakoś zbadać obiekt znaleźć to samo)?

żądanie POST ciało będzie wyglądać następująco:

http://pastebin.com/SWjLrHig

Próbowałem zostały również request.json (bez powodzenia)

jakieś rady?

EDIT: skończyło się przy użyciu to:

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 

interesujący teraz parsedBody wygląda dobrze:

{"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"} 

ale jsonObj nie jest tak dobre: ​​

{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} 

jednak kiedy robię coś takiego, jak

print jsonObj['repository']['name'] 

to działa zgodnie z oczekiwaniami (tylko drukuje nazwę „test”)

Odpowiedz

5

Jak stwierdza dokumentacji butelka, dane żądanie jest „plik jak przedmiot”. http://bottlepy.org/docs/dev/tutorial.html#the-raw-request-body

Dostęp do surowego ciała przy użyciu read().

Również dir nie jest metoda obiektów, to wolnostojąca funkcja którą nazywasz przechodząc obiektu.

dir(request.body) 

I googlowania dla StringIO powinny przyniosły wam tutaj: https://docs.python.org/2/library/stringio.html

+0

zrobiłem przybyć https://docs.python.org/2/library/stringio.html przed wysłaniem, ale użycie nie było dla mnie oczywiste, i nie widzę read() na tej stronie (choć wydaje mi się, że działa). Ciąg zwracany przez read() zwraca jednak bardzo brzydkie kodowanie, wszystkie "i {są zamieniane na% 22% 2C +% 22. Czy istnieje elegancki sposób na pochłonięcie tego jako json, a może na metodę stringio> json? próbując uniknąć analizowania tekstu za pomocą manipulacji tekstem .... – 3z33etm

+0

@ 3z33etm Dokumentacja StringIO sugeruje czytanie pliku-obiektu-dokumentacji.Ale tak, przykład do czytania byłby miły. Zgłoś problem;) Jeśli chodzi o problemy z kodowaniem: jest to prawdopodobnie jakaś forma kodowania urlenowego, którą można dekodować za pomocą modułów urllib lub cgi. Spójrz na nagłówki żądania. To może być powód, dla którego 'request.json' nie działa. – deets

+0

dzięki, dobra informacja. – 3z33etm

Powiązane problemy