2012-01-12 6 views
1

(この質問は関連している - が、同じではない - this 1に)web.pyのgithubからPOSTデータをデコードするには?

これは私が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":"[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} 

そこには、payload=ビットの後にJSONが見えます。私が持っている質問は、完全なデータはどのような形式ですか?標準のPythonライブラリを使用してペイロードビットを取得するにはどうすればよいですか。特別な事例はわからないので、私は自分自身で文字列を分割しないようにしたいと考えています。

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

どのようにこのparams配列が標準ライブラリに、pythonで処理することができます。

github help pageが、これはシナトラサーバの実装を提案し提供しますか? Rubyコードの最もpythonicな実装は何ですか?私の最終目標は、完全なPOSTデータをPython辞書としてアクセスできるようにすることです。 rは、応答として受信した文字列である

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

+0

可能重複[PythonでJSONオブジェクトに文字列データを変換するには?](http://stackoverflow.com/questions/8740353/how-to-convert-a-string-data-to-a-json-object-in-python) –

+0

いいえ、それは重複していません(ところで、私は* 。もう1つの質問には、JSONデータの前に 'payload = 'という接頭辞がありません。 – dangonfast

答えて

3

はこれを試してみてください。

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

+0

これは非常にアドホックで、私が探しているものではありません。私はこの特定のPOSTデータを処理したくありません(私は実際には望みますが、これはポイントではありません)。 PythonでPOSTパラメータにアクセスする方法を知りたい – dangonfast

+0

私はあなたがjsonの部分を解釈することにもっと興味があると思った。私は、クエリ文字列を解析するコードを変更しました。 – thesamet

+0

また、parse_qsはあなたの引用符で囲まれていないので、urllib.unquoteでデータを渡す必要はありません。 – thesamet

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

ありがとうございますが、私の質問で* 2回*述べたように、私はPOSTパラメータを*標準*ライブラリで解析し、それを特別なものに分割しません。 PythonのPOST要求内のすべてのパラメータを歩くための受け入れられた方法がなければなりません。私の場合には唯一の 'payload'がJSONデータを持っています。 POSTリクエストのさまざまなパラメータを取得する方法についてのみ、JSONデータのデコードに関する質問はありません。 – dangonfast

+0

質問を誤解して謝罪します。 'urlparse.parse_qsl'はあなたの後ろにあることを望む(key、json-encodedの値)のリストを返します。 –

+0

私のコメントでは、私はそれに応じて私の答えを編集したことを忘れてしまった。 –

関連する問題