2013-02-06 24 views
7

Rất tiếc, tôi thấy mình trong tình huống mà tôi cần sửa đổi ứng dụng Giá treo hiện có để xử lý các URL cung cấp nhiều tham số có cùng tên. Giống như sau ... miền: cảng/hành động c = 1 & v = 3 & c = 4Cách nhận nhiều thông số có cùng tên từ URL trong giá treo?

Thông thường các thông số được truy cập theo cách này ...

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

này sẽ trở lại " 4 "là giá trị trong cả hai trường hợp, bởi vì bỏ qua tất cả nhưng giá trị cuối cùng có vẻ là hành vi tiêu chuẩn trong các tình huống này. Những gì tôi thực sự cần mặc dù, là để có thể truy cập cả hai. Tôi đã cố gắng in ra request.params và nhận được một cái gì đó như thế này ...

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

Tôi chưa tìm cách để lập chỉ mục vào nó, hoặc truy cập giá trị đầu tiên đó cho c.

Tôi tìm thấy một similar question liên quan đến vấn đề này, nhưng giải quyết với PHP:

cái gì đó dọc những dòng này sẽ làm việc tốt cho tôi, nhưng có lẽ một số mã Python sẽ phù hợp với giá treo. Có ai xử lý một cái gì đó như thế này trước đây?

+0

Cảm ơn bạn đã sửa định dạng! Nó không diễn ra theo cách tôi đã dự định rõ ràng ... –

+1

Đúng nếu tôi sai, nhưng nhiều đối tượng KEY không thể tồn tại trong cùng một yêu cầu? Điều này là chống lại tất cả các định nghĩa .. – Torxed

+0

Bạn có nói rằng không nên có hai tham số có cùng tên không? Nếu đó là câu hỏi của bạn, tôi đồng ý rằng thực hành tốt nhất sẽ tránh nó. Nó không bị nghiêm cấm. Ví dụ: thử nhập url này vào trình duyệt của bạn (https://www.google.com/search?q=one&q=two). Có hai tham số truy vấn, do đó Google kết hợp cả hai tham số thành một. Đây là nhiều hơn hoặc ít hơn những gì tôi muốn để có thể làm. –

Trả lời

8

Từ các tài liệu - http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/glossary.html#term-multidict:

multidict Một lệnh từ điển mà có thể có nhiều giá trị cho mỗi phím. Thêm các phương thức getall, getone, mixed, add và dict_of_lists vào giao diện từ điển thông thường. Xem Multidict và pyramid.interfaces.IMultiDict.

Vì vậy, chỉ cần gọi:

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

Câu trả lời hoàn hảo, và tôi đánh giá cao các tài liệu như một tài liệu tham khảo. Cảm ơn bạn rất nhiều!+1 và được chấp nhận –

1

Như một bài tập, một vẽ bằng Python của PHP trong other question (cũng bao gồm một tham số giả để minh họa cho sự cần thiết của url giải mã):

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

Nói đúng, tôi không thực sự có url dưới dạng chuỗi, mặc dù tôi có toàn bộ yêu cầu bao gồm GET và tôi có thể phân tích cú pháp url đó. Cách tiếp cận này có vẻ hợp lệ, nhưng phức tạp hơn một chút trong ngữ cảnh của một ứng dụng Giá treo. Tôi sẽ cung cấp cho nó một +1 mặc dù, với hy vọng rằng nó sẽ giúp một người nào đó với một vấn đề tương tự. –

+0

Cảm ơn - Tôi đã đặt nó lên trong cùng một tinh thần và câu trả lời đúng là tất nhiên là bởi Jon Clements. – gauden