【问题标题】:how to get request body text using bottle?如何使用瓶子获取请求正文?
【发布时间】:2015-08-10 03:43:03
【问题描述】:

我正在使用瓶子从 bitbucket 接收 POST webhook。 POST 的正文包含有关 repo 中更改内容等的信息。我可以使用 @post('/myroute') 完成此操作,但是我无法获取实际的 POST 正文数据文本。

这是一张显示我正在做的端到端的图像 http://i.imgur.com/rWc7Hry.png

当打印到 consolerequest.body 时:

StringIO.StringIO 实例位于 0x7fa13341c4d0

request.body.dir() 产生:

AttributeError: StringIO 实例没有属性'dir'

我想知道如何获得请求正文的实际文本(或以某种方式检查对象以找到相同的内容)?

POST 请求正文如下所示:

http://pastebin.com/SWjLrHig

我也试过request.json(运气不好)

有什么建议吗?

编辑: 我最终使用了这个:

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 

有趣的是,parsedBody 看起来不错:

{"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<testName@testName.info>","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"}

但是jsonObj不太好:

{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<TestName@TestName.info>', 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}

但是,当我做类似的事情时

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

它按预期工作(只是打印名称'test')

【问题讨论】:

    标签: python bottle


    【解决方案1】:

    正如瓶子文档所述,请求数据是“类似对象的文件”。 http://bottlepy.org/docs/dev/tutorial.html#the-raw-request-body

    因此,您使用 read() 访问原始正文。

    另外,dir 不是一个对象的方法,它是一个独立的函数,你称之为传递一个对象。

    dir(request.body)
    

    谷歌搜索 StringIO 应该会把你带到这里:https://docs.python.org/2/library/stringio.html

    【讨论】:

    • 我在发帖前确实到达了docs.python.org/2/library/stringio.html,但对我来说用法并不明显,我在该页面上看不到 read() (尽管它似乎有效)。然而, read() 返回的字符串返回一个非常难看的编码,所有的 " 和 { 都被替换为 %22%2C+%22。有没有一种优雅的方法可以将它作为 json 或者 stringio > json 方法来摄取?我是试图避免使用文本操作来解析它......
    • @3z33etm StringIO 文档建议阅读文件对象文档。但是,是的,一个阅读的例子会很好。提出问题;)关于编码问题:它可能是某种形式的 urlencoding,可以使用 urllib 或 cgi 模块进行解码。查看请求的标头。这可能是request.json 不起作用的原因。
    猜你喜欢
    • 2021-03-07
    • 2019-11-28
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2021-12-30
    相关资源
    最近更新 更多