2013-02-06 10 views
7

Tak więc niestety znalazłem się w sytuacji, w której muszę zmodyfikować istniejącą aplikację Pylons do obsługi adresów URL, które zapewniają wiele parametrów o tej samej nazwie. Coś jak na poniższym ... domeny: port/akcji c = 1 & v = 3 & c = 4Jak uzyskać wiele parametrów o tej samej nazwie z adresu URL w Pylons?

Tradycyjnie parametry są dostępne w ten sposób ...

from pylons import request 
c = request.params.get("c") 
#or 
c = request.params["c"] 

To wróci " 4 "jako wartość w obu przypadkach, ponieważ ignorowanie wszystkich oprócz ostatniej wartości wydaje się być standardowym zachowaniem w tych sytuacjach. To, czego naprawdę potrzebuję, to mieć dostęp do obu. Próbowałem drukowanie request.params i dostać coś takiego ...

NestedMultiDict([(u'c', u'1'),(u'v', u'3'),(u'c', u'4')]) 

nie znalazłem drogę do indeksu do niego dostęp lub że pierwsza wartość dla C.

znalazłem similar question odnoszących się do tego problemu, ale rozwiązany z PHP:

Coś wzdłuż tych linii będzie działać dobrze dla mnie, ale może jakiś kod Pythona, który pasowałby do Pylony. Czy ktoś wcześniej zajmował się czymś takim?

+0

Dziękujemy za poprawienie formatowania! Nie było tak, jak zamierzałem, oczywiście ... –

+1

Popraw mnie, jeśli się mylę, ale wiele obiektów KEY nie może istnieć w ramach tego samego żądania? Jest to sprzeczne z wszelkimi definicjami. – Torxed

+0

Czy mówisz, że nie powinno być dwóch parametrów o tej samej nazwie? Jeśli to jest twoje pytanie, zgadzam się, że najlepsze praktyki uniknęłyby tego. Nie jest to jednak zabronione. Na przykład spróbuj wpisać ten adres URL w przeglądarce (https://www.google.com/search?q=one&q=two). Istnieją dwa parametry zapytania, więc Google łączy je w jedno. Jest to mniej więcej to, co chciałbym móc zrobić. –

Odpowiedz

8

Od docs - http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/glossary.html#term-multidict:

multidict Uporządkowana słownika, który może mieć wiele wartości dla każdego klawisza. Dodaje metody getall, getone, mixed, add i dict_of_lists do normalnego interfejsu słownika. Zobacz Multidict i pyramid.interfaces.IMultiDict.

Więc po prostu zadzwonić:

request.params.getall('c') 
+0

Doskonała odpowiedź i doceniam dokumentację jako punkt odniesienia. Dziękuję bardzo!+1 i akceptowany –

1

jako ćwiczenie, rendering w Pythonie z PHP w other question (obejmuje również obojętne parametru, aby zilustrować potrzebę dekodowania URL):

from urlparse import urlparse 
from urllib import unquote 

url = 'http://www.example.com/action?c=1&v=3&c=4&d=%3A%24%23%40%3D%3F%25%5EQ%5E%24' 

url = urlparse(url) 

params = url.query.split('&') 
params = [ tuple(p.split('=')) for p in params ] 
params = [ [unquote(p[0]), unquote(p[1])] for p in params ] 

print params 

# [['c', '1'], ['v', '3'], ['c', '4'], ['d', ':$#@=?%^Q^$']] 
+0

Ściśle mówiąc nie mam adresu URL jako ciąg, chociaż mam całą prośbę, która zawiera GET i mogę przetworzyć adres URL z tego. To podejście wydaje się również prawidłowe, ale nieco bardziej skomplikowane w kontekście aplikacji Pylons. Dam mu +1, w nadziei, że pomoże to komuś z podobnym problemem. –

+0

Dzięki - dodałem to w tym samym duchu, a właściwą odpowiedzią jest oczywiście Jon Clements. – gauden

Powiązane problemy