Python анализ строки запроса в список - PullRequest
2 голосов
/ 14 июля 2011

У меня есть форма для отправки данных на сервер, которая выглядит следующим образом:

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
...

Я использую Flask, и я хотел бы иметь возможность циклически проходить через videos и momentsно кажется, что нет способа сделать это.Я пытался искать библиотеки в Google, но мой Google-фу сегодня слабый.

Есть предложения?Спасибо!

РЕДАКТИРОВАТЬ : основываясь на ответе 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': {'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'}}}

для запроса, который выглядит следующим образом:

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
...

Ответы [ 2 ]

3 голосов
/ 14 июля 2011

Вы можете использовать urlparse.parse_qsl , чтобы получить параметры запроса.Однако вам потребуется вручную создать видеообъекты.

Примером реализации может быть:

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 голосов
/ 14 июля 2011

Если вы используете 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'
   }
 ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...