2012-01-12 67 views
1

(這個問題是有關 - 但不是相同的 - this一個)如何在web.py中解碼來自github的POST數據?

這是POST數據,我從github上鉤得到:

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":"[email protected]"}},"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給出了這樣的建議了西納特拉服務器實現:

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

這怎麼params陣列中的蟒蛇進行處理,並帶有標準庫?那個Ruby代碼最Python的實現是什麼?我的最終目標是將完整的POST數據作爲Python字典訪問。

+0

可能重複[如何將字符串數據轉換爲Python中的JSON對象?(http://stackoverflow.com/questions/8740353/how-to-convert-a-string-data-to-a-json-object-in-python) – 2012-01-12 09:54:35

+0

不,它不是重複的(順便說一句,我已經鏈接到*正是*我的那個問題) 。另一個問題是JSON數據沒有「payload =」前綴。 – dangonfast 2012-01-12 10:24:31

回答

3

試試這個:

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

+0

這是_very_ ad-hoc,並不是我所尋找的。我不想處理這個特定的POST數據(我真的想要,但這不是重點)。我想*瞭解*如何在python中訪問POST參數。 – dangonfast 2012-01-12 10:29:39

+0

我以爲你對解釋json部分更感興趣。我改變了解析查詢字符串的代碼。 – thesamet 2012-01-12 11:15:41

+0

另外,parse_qs不會爲你引用,所以不需要通過urllib.unquote傳遞數據。 – thesamet 2012-01-12 11:27:51

1
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'} 
+0

謝謝,但正如我提到*兩次*在我的問題中,我想用*標準*庫解析POST參數,而不是專門分割它。必須有一種可接受的方式來在Python中的POST請求中遍歷所有參數,其中一個「有效載荷」 - 在我的情況中是唯一的 - 偶然有JSON數據。請注意,我沒有關於解碼JSON數據的問題,只是關於如何獲取POST請求的不同參數。 – dangonfast 2012-01-12 10:27:48

+0

誤解這個問題的道歉。 'urlparse.parse_qsl'返回一個(key,json-encoded的值)的列表,我希望你在這之後。 – 2012-01-12 11:35:16

+0

我忘了在我的評論中提到我已經編輯了我的答案。 – 2012-01-12 11:45:30