2011-07-14 5 views
2

を一覧表示するには、クエリ文字列を解析:はPythonは、私は次のようなサーバーにデータを送信するフォームを持っている

videos[0][type]=Vimeo& 
    videos[0][moments][0][time]=11& 
    videos[0][moments][0][lng]=111& 
    videos[0][moments][0][lat]=111& 
    videos[0][moments][1][time]=222& 
    videos[0][moments][1][lng]=222& 
    videos[0][moments][1][lat]=222& 
videos[1][type]=YouTube& 
    videos[1][moments][0][time]=111& 
    videos[1][moments][0][lng]=111& 
    videos[1][moments][0][lat]=111 
... 

私はフラスコを使用していますが、私はvideosmomentsをループできるようにしたいと思いますそれをする方法がないように思えます。私はGoogleで図書館を探してみましたが、私のGoogle-fuは今夜は弱いです。

提案がありますか?ありがとう!

EDIT

:ように見えるクエリの

{'map': {'title': 'orange'}, 'videos': {'1': {'moments': {'0': {'lat': '111', 'lng': '111', 'time': '111'}}, 'type': 'YouTube'}, '0': {'moments': {'1': {'lat': '222', 'lng': '222', 'time': '222'}, '0': {'lat': '111', 'lng': '111', 'time': '11'}}, 'type': 'Vimeo'}}} 

:lazy1の答えに基づいて、私はハッシュを生成します

def add(root, path, value): 
    for part in path[:-1]: 
    root = root.setdefault(part, {}) 
    root[path[-1]] = value 

def parse(s): 
    items = {} 
    for key, value in parse_qsl(s): 
    parts = filter(None, re.split('[\[\]]', key)) 
    name = parts[0] 
    if name not in items: 
     items[name] = {} 
    add(items[name], parts[1:], value) 
    return items 

に彼/彼女のコードを修正しました

map[title]=orange& 
videos[0][type]=Vimeo& 
    videos[0][moments][0][time]=11& 
    videos[0][moments][0][lng]=111& 
    videos[0][moments][0][lat]=111& 
    videos[0][moments][1][time]=222& 
    videos[0][moments][1][lng]=222& 
    videos[0][moments][1][lat]=222& 
videos[1][type]=YouTube& 
    videos[1][moments][0][time]=111& 
    videos[1][moments][0][lng]=111& 
    videos[1][moments][0][lat]=111 
... 

答えて

3

urlparse.parse_qslを使用すると、クエリpを取得できますarameters。ただし、ビデオオブジェクトを手動で構築する必要があります。

例の実装では、することができ:

def add(root, path, value): 
    for part in path[:-1]: 
     root = root.setdefault(part, {}) 
    root[path[-1]] = value 

def parse(s): 
    videos = {} 
    for key, value in parse_qsl(s): 
     parts = filter(None, re.split('[\[\]]', key)) 
     insert(videos, parts[1:], value) 
    return videos 
2

formencodeを使用してのあなたの鍵の形式を変更することができた場合:

map.title=orange& 
videos-0.type=Vimeo& 
    videos-0.moments-0.time=11& 
    videos-0.moments-0.lng=111& 
    videos-0.moments-0.lat=111& 
    videos-0.moments-1.time=222& 
    videos-0.moments-1.lng=222& 
    videos-0.moments-1.lat=222& 
videos-1.type=YouTube& 
    videos-1.moments-0.time]=111& 
    videos-1.moments-0.lng]=111& 
    videos-1.moments-0.lat]=111 

あなたが使用することができます。

from urlparse import parse_qsl 
from formencode.variabledecode import variable_decode 

def parse(s): 
    return variable_decode(parse_qsl(s)) 

を与えるために:

{ 
'map': {'title': 'orange'}, 
'videos': [ 
    { 
    'moments': [ {'lat': '111', 'lng': '111', 'time': '11'}, 
        {'lat': '222', 'lng': '222', 'time': '222'}], 
    'type': 'Vimeo' 
    }, { 
    'moments': [ {'lat': '111', 'lng': '111', 'time': '111'} ], 

    'type': 'YouTube' 
    } 
] 
} 
+0

ありがとうございます!私はそのライブラリを使用すると思う。私は名前の形式が気に入らないが、私はそれで暮らすことができると思う。 :) – Haochi

関連する問題