2015-05-27 19 views
5

Tôi đang sử dụng chai để nhận POST webhook từ bitbucket. Nội dung của POST chứa thông tin về những gì đã thay đổi trong repo, v.v. Tôi có thể làm điều này với @post('/myroute'), tuy nhiên tôi gặp sự cố khi truy cập vào văn bản dữ liệu nội dung POST thực tế.cách yêu cầu văn bản nội dung bằng cách sử dụng chai?

đây là một hình ảnh cho thấy những gì tôi đang làm đầu đến cuối http://i.imgur.com/rWc7Hry.png

Khi in để an ủi request.body sản lượng:

StringIO.StringIO instance at 0x7fa13341c4d0

request.body.dir() sản lượng:

AttributeError: StringIO instance has no attribute 'dir'

tôi Tôi tự hỏi làm thế nào để có được văn bản thực tế của cơ thể yêu cầu (hoặc kiểm tra đối tượng bằng cách nào đó để tìm thấy như vậy)?

yêu cầu cơ thể POST sẽ giống như thế này:

http://pastebin.com/SWjLrHig

Tôi cũng đã thử request.json (không may mắn)

lời khuyên nào?

EDIT: tôi đã kết thúc sử dụng này:

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 

thú vị bây giờ, parsedBody vẻ tốt:

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

nhưng jsonObj không phải là quá tốt:

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

tuy nhiên, khi tôi làm điều gì đó như

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

nó hoạt động như mong đợi (chỉ in tên 'test')

Trả lời

5

Theo các tiểu bang tài liệu chai, dữ liệu yêu cầu là "một tập tin như đối tượng". http://bottlepy.org/docs/dev/tutorial.html#the-raw-request-body

Vì vậy, bạn truy cập cơ thể thô bằng cách sử dụng read().

Ngoài ra, dir không phải là một phương pháp của các đối tượng, đó là một chức năng đứng độc lập mà bạn gọi qua một đối tượng.

dir(request.body) 

Và googling cho StringIO nên đã mang lại các bạn ở đây: https://docs.python.org/2/library/stringio.html

+0

tôi đã đến https://docs.python.org/2/library/stringio.html trước khi gửi bài, nhưng việc sử dụng không rõ ràng với tôi, và tôi không thấy read() trên trang đó (có vẻ như nó hoạt động). Chuỗi trả về bởi read() tuy nhiên trả về một mã hóa rất xấu, tất cả "và {được thay thế bằng% 22% 2C +% 22. Có cách nào thanh lịch để nhập dữ liệu này như là json, hoặc có thể là một phương thức stringio> json? cố gắng tránh phân tích nó bằng thao tác văn bản .... – 3z33etm

+0

@ 3z33etm Tài liệu StringIO gợi ý đọc tài liệu-đối tượng-tệp.Nhưng có, một ví dụ để đọc sẽ tốt đẹp. Gửi một vấn đề;) Về vấn đề mã hóa: nó có thể là một số dạng urlencoding, có thể được giải mã bằng các mô-đun urllib hoặc cgi. Hãy xem các tiêu đề của yêu cầu. Đó có thể là lý do tại sao 'request.json' không hoạt động. – deets

+0

cảm ơn, thông tin tốt. – 3z33etm

Các vấn đề liên quan