2015-05-27 22 views
5

BitBucket'ten POST web karesi almak için şişeyi kullanıyorum. POST'un gövdesi, repoda ne değiştiğini, vb. Hakkında bilgi içerir. @post('/myroute') ile bu kadar iyi bir şey yapabilirim, ancak gerçek POST gövdesi veri metnine ulaşmakta sorun yaşıyorum.Şişe kullanarak vücut metnini nasıl alabilirim?

StringIO.StringIO instance at 0x7fa13341c4d0

ve request.body.dir() verim:

AttributeError: StringIO instance has no attribute 'dir'

Burada

request.body verim konsola baskılı zaman http://i.imgur.com/rWc7Hry.png

uçtan uca ne yapıyorum gösteren bir resimdir İstek gövdesinin asıl metnine nasıl ulaşacağımı merak ediyorum (ya da nesneyi bir şekilde aynı bulmak)? Ben de request.json (hayır şans)

herhangi bir tavsiye denedim

http://pastebin.com/SWjLrHig

:

POST isteği vücut bu gibi bir şey olacaktır? ,

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

ancak:

DÜZENLEME:

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 

ilginç şimdi, parsedBody iyi görünüyor: ben bu kullanarak sona erdi

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

ama jsonObj o kadar iyi değil

01 gibi bir şey yaptığımda beklendiği gibi çalıştığını
print jsonObj['repository']['name'] 

istek verileri "nesne gibi bir dosya" dir, şişe dokümantasyon devletler olarak

cevap

5

(sadece 'test' adını yazdırır). Böylece read() kullanarak ham gövdeye erişebilirsiniz.

Ayrıca dir nesnelerin yöntem değil, sen bir nesne geçirerek dediğimiz müstakil fonksiyon.

dir(request.body) 

Ve StringIO googling buraya getiren olmalıydı: i göndermeden önce https://docs.python.org/2/library/stringio.html vardın https://docs.python.org/2/library/stringio.html

+0

ama kullanımı değildi bana açık ve o sayfada read() görmüyorum (işe yarayacak gibi görünüyor olsa da). Read() tarafından döndürülen dize, çok çirkin bir kodlama döndürür, tüm "ve {% 22% 2C +% 22 ile değiştirilir. Bunu json veya belki bir stringio> json yöntemi olarak almanın zarif bir yolu var mıyım? text manipulation ile ayrıştırmaktan kaçınmaya çalışmak .... – 3z33etm

+0

@ 3z33etm StringIO belgeleri, dosya-nesne-belgelerini okumanızı önerir.Ama evet, okumak için bir örnek güzel olurdu. Bir sorunu dosyalayın;) Kodlama sorunları ile ilgili olarak: muhtemelen urllib veya cgi modülleri kullanılarak kodu çözülebilen bir çeşit kodlamadır. İsteğin başlıklarına bir göz atın. Request.json'un çalışmadığı neden bu olabilir. – deets

+0

teşekkürler, iyi bilgi. – 3z33etm