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
và 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:
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')
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
@ 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
cảm ơn, thông tin tốt. – 3z33etm