【问题标题】:How to decode POST data from github in web.py?如何在 web.py 中解码来自 github 的 POST 数据?
【发布时间】:2012-02-08 14:45:51
【问题描述】:

(这个问题与this one 相关——但不一样)

这是我从 github 钩子获得的 POST 数据:

payload=%7B%22pusher%22%3A%7B%22name%22%3A%22none%22%7D%2C%22repository%22%3A%7B%22name%22%3A%22test%22%2C%22size%22%3A84%2C%22has_wiki%22%3Atrue%2C%22created_at%22%3A%222012%2F01%2F12%2001%3A04%3A25%20-0800%22%2C%22watchers%22%3A1%2C%22private%22%3Afalse%2C%22fork%22%3Afalse%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Fgonvaled%2Ftest%22%2C%22pushed_at%22%3A%222012%2F01%2F12%2001%3A05%3A26%20-0800%22%2C%22has_downloads%22%3Atrue%2C%22open_issues%22%3A0%2C%22has_issues%22%3Atrue%2C%22homepage%22%3A%22%22%2C%22description%22%3A%22%22%2C%22forks%22%3A1%2C%22owner%22%3A%7B%22name%22%3A%22gonvaled%22%2C%22email%22%3A%22gonvaled%40gonvaled.com%22%7D%7D%2C%22forced%22%3Afalse%2C%22after%22%3A%2214209371dcbdd95cc3ef5c4a07d80edd42f1295c%22%2C%22deleted%22%3Afalse%2C%22ref%22%3A%22refs%2Fheads%2Fmaster%22%2C%22commits%22%3A%5B%5D%2C%22before%22%3A%2214209371dcbdd95cc3ef5c4a07d80edd42f1295c%22%2C%22compare%22%3A%22https%3A%2F%2Fgithub.com%2Fgonvaled%2Ftest%2Fcompare%2F1420937...1420937%22%2C%22created%22%3Afalse%7D

我可以用这个解码:

urllib.unquote(data)

得到这个:

payload={"pusher":{"name":"none"},"repository":{"name":"test","size":84,"has_wiki":true,"created_at":"2012/01/12 01:04:25 -0800","watchers":1,"private":false,"fork":false,"url":"https://github.com/gonvaled/test","pushed_at":"2012/01/12 01:05:26 -0800","has_downloads":true,"open_issues":0,"has_issues":true,"homepage":"","description":"","forks":1,"owner":{"name":"gonvaled","email":"gonvaled@gonvaled.com"}},"forced":false,"after":"14209371dcbdd95cc3ef5c4a07d80edd42f1295c","deleted":false,"ref":"refs/heads/master","commits":[],"before":"14209371dcbdd95cc3ef5c4a07d80edd42f1295c","compare":"https://github.com/gonvaled/test/compare/1420937...1420937","created":false}

我可以在那里看到 JSON,在 payload= 位之后。我的问题是:完整数据的格式是什么?如何使用标准 python 库仅获取有效负载位;我宁愿避免自己拆分字符串,因为我不知道特殊情况。

github help page 为 Sinatra 服务器提供了这个建议的实现:

post '/' do
  push = JSON.parse(params[:payload])
  "I got some JSON: #{push.inspect}"
end

如何使用标准库在 python 中处理这个params 数组?那个 Ruby 代码最 Pythonic 的实现是什么?我的最终目标是将完整的 POST 数据作为 python 字典进行访问。

【问题讨论】:

标签: python json web-services github web.py


【解决方案1】:

试试这个:

import json
import urlparse
data = urlparse.parse_qs(r)
print json.loads(r['payload'][0])

r 是您收到的响应字符串。

见http://docs.python.org/library/urlparse.html#urlparse.parse_qs

【讨论】:

  • 这是 very ad-hoc,完全不是我想要的。我不想处理这个特定的 POST 数据(我实际上想要,但这不是重点)。我想学习如何在python中访问POST参数。
  • 我认为您对解释 json 部分更感兴趣。我更改了代码以解析查询字符串。
  • 另外,parse_qs 会为您取消引用,因此无需通过 urllib.unquote 传递数据。
  • 谢谢,这行得通。请注意:对于 python 2.5,parse_qs 在模块 cgi 中。
【解决方案2】:
import urlparse
import json
s = "payload=%7B%22pusher%22%3A%7B%22name%22%3A%22none%22%7D%2C%22repository%22%3A%7B%22name%22%3A%22test%22%2C%22size%22%3A84%2C%22has_wiki%22%3Atrue%2C%22created_at%22%3A%222012%2F01%2F12%2001%3A04%3A25%20-0800%22%2C%22watchers%22%3A1%2C%22private%22%3Afalse%2C%22fork%22%3Afalse%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2Fgonvaled%2Ftest%22%2C%22pushed_at%22%3A%222012%2F01%2F12%2001%3A05%3A26%20-0800%22%2C%22has_downloads%22%3Atrue%2C%22open_issues%22%3A0%2C%22has_issues%22%3Atrue%2C%22homepage%22%3A%22%22%2C%22description%22%3A%22%22%2C%22forks%22%3A1%2C%22owner%22%3A%7B%22name%22%3A%22gonvaled%22%2C%22email%22%3A%22gonvaled%40gonvaled.com%22%7D%7D%2C%22forced%22%3Afalse%2C%22after%22%3A%2214209371dcbdd95cc3ef5c4a07d80edd42f1295c%22%2C%22deleted%22%3Afalse%2C%22ref%22%3A%22refs%2Fheads%2Fmaster%22%2C%22commits%22%3A%5B%5D%2C%22before%22%3A%2214209371dcbdd95cc3ef5c4a07d80edd42f1295c%22%2C%22compare%22%3A%22https%3A%2F%2Fgithub.com%2Fgonvaled%2Ftest%2Fcompare%2F1420937...1420937%22%2C%22created%22%3Afalse%7D"
L = urlparse.parse_qsl(s)
for k, v in L:
    print k
    print json.loads(v)

给予

payload
{u'forced': False, u'compare': u'https://github.com/gonvaled/...1420937', ... 
 u'before': u'14209371dcbdd95cc3ef5c4a07d80edd42f1295c'}

【讨论】:

  • 谢谢,但正如我的问题中提到的 两次,我想用 standard 库解析 POST 参数,而不是将其拆分为 ad-特设的。必须有一种可接受的方式在 python 中遍历 POST 请求中的所有参数,其中一个 payload - 在我的情况下是唯一的一个 - 附带有 JSON 数据。请注意,我没有与解码 JSON 数据相关的问题,只是关于如何获取 POST 请求的不同参数。
  • 对问题的误解表示歉意。 urlparse.parse_qsl 返回一个(键,json 编码的值)列表,我希望这是您所追求的。
  • 我忘了在我的评论中提到我已经相应地编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-28
  • 2012-01-29
  • 1970-01-01
  • 2023-02-06
  • 2021-09-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多