2012-05-21 28 views
13
address_dict = {'address': {'US': 'San Francisco', 'US': 'New York', 'UK': 'London'}} 

Khi thông số trên được gửi qua yêu cầu, làm cách nào tôi có thể nhận được giá trị trong khóa địa chỉ bằng cách sử dụng request.form trên Flask?Làm thế nào tôi có thể nhận được giá trị của từ điển lồng nhau bằng cách sử dụng ImmutableMultiDict trên Flask?

import requests 
url = 'http://example.com' 
params = {"address": {"US": "San Francisco", "UK": "London", "CH": "Shanghai"}} 
requests.post(url, data=params) 

Sau đó, tôi nhận được điều này trong bối cảnh flask.request.

ImmutableMultiDict([('address', u'US'), ('address', 'US'), ('address', 'UK')]) 

Làm cách nào để có được giá trị trong mỗi khóa địa chỉ?

Cảm ơn.

Trả lời

16

ví dụ như thế này:

from werkzeug.datastructures import ImmutableMultiDict 
imd = ImmutableMultiDict([('address', u'US'), ('address', 'US'), ('address', 'UK')]) 
print imd.getlist('address') 

in:

[u'US', 'US', 'UK'] 

chỉnh sửa:

POST-Yêu cầu của bạn sẽ được gửi application/x-www-form-urlencoded, điều đó có nghĩa là sự kết hợp như là chìa khóa/giá trị cặp. Nó không hỗ trợ một cấu trúc dict lồng nhau trực tiếp. Khi tôi thử yêu cầu curl của bạn, tôi nhận được điều này:

ImmutableMultiDict([('address[US]', u'San Francisco'), ('address[US]', u'New York'), ('address[UK]', u'London')]) 

để các phím được diễn giải theo nghĩa đen tại đây.

và sử dụng urllib2 tôi nhận được kết quả này:

>>> print urllib2.urlopen("http://localhost:5000/post", data=urllib.urlencode(address_dict)).read() 
ImmutableMultiDict([('address', u"{'UK': 'London', 'US': 'New York'}")]) 

đây urlencode chỉ đơn giản gửi một chuỗi đại diện của dict bên trong.

và cuối cùng là sử dụng requests:

>>> print requests.post("http://localhost:5000/post", data=address_dict).content 
ImmutableMultiDict([('address', u'UK'), ('address', u'US')]) 

đây mảng được san phẳng và các phím định kỳ loại bỏ.

Chỉ đơn giản là không có cách xác định làm thế nào để gửi một dict lồng nhau như của bạn một cách urlencoded, vì vậy bạn sẽ phải tìm một giải pháp.

+0

Có cách nào để đưa 'San Francisco' vào ví dụ trên không? Tôi có nghĩa là giá trị của dict trong dict cha mẹ. – kinakomochi

+0

Thông tin đó dường như không nằm trong dict ...Tôi không chắc chắn bạn có thể gửi một dict như thế này ... phải kiểm tra nó ... Làm thế nào để bạn gửi yêu cầu bài viết? – mata

+0

Tôi gửi yêu cầu đăng qua curl. Xin lỗi vì thiếu lời giải thích. Tôi muốn nhận các giá trị (San Francisco, New York, London) từ địa chỉ dict. – kinakomochi

1

Bạn đã ví dụ này:

curl http://example.com -d "address[US]=San Francisco" -d "address[US]=New York" -d address[UK]=London" 

Với yêu cầu như vậy, request.form sẽ trông như thế này:

>>> request.form 
ImmutableMultiDict([('address[US]', u'San Francisco'), ('address[US]', u'New York'), 
        ('address[UK]', u'London')]) 
>>> request.form['address[US]'] 
u'San Francisco' 
>>> request.form.getlist('address[US]') 
[u'San Francisco', u'New York'] 

Các [] ký tự không phải là đặc biệt, họ chỉ là một phần trong những chìa khóa . As documented, một MultiDict sẽ ánh xạ mỗi khóa không chỉ với một giá trị mà tới một danh sách các giá trị. Truy cập dictionnary bình thường với [] sẽ chỉ cung cấp cho bạn khóa đầu tiên, nhưng phương thức getlist() cung cấp toàn bộ danh sách cho một khóa. Các phương pháp khác có sẵn, xem tài liệu.

Nếu bạn thực sự muốn có cấu trúc lồng nhau, hãy thử JSON thay vì dữ liệu biểu mẫu dạng phẳng.