将multidict值添加到列表中

时间:2014-03-25 15:02:05

标签: python list dictionary pyramid

我从HTML表单发送数据,我用python(Pyramid框架)处理它,这就是我在我看来的内容:

 @view_config(renderer='json', request_method='POST')
    def modify(self):
        d = self.request.params
        if d.get("perms"):
            if type(d.get("perms")) == str or type(d.get("perms")) == unicode:
                d["perms"] = [d["perms"]]
            for perm in d["perms"]:
                d[perm] = "on"

当我尝试d["perms"] = [d["perms"]]时,我收到错误:

KeyError: 'NestedMultiDict objects are read-only'

我试图将上面的代码更改为:

perms = []
for k, v in d.iteritems():
    if k == "perms":
        if type(v) == str or type(v) == unicode:
            perms = [v]
        for perm in perms:
            d[perm] = "on"

但它给了我同样的错误。

是否可以在列表中添加MultiDict值? 如果是这样,怎么样? 为什么MultiDict只读?

1 个答案:

答案 0 :(得分:4)

你不需要做你正在做的事情:)只需使用request.getall('perm'),它将始终返回一个列表。

  

WebOb请求的几个属性是“multidict”;结构   (例如request.GET,request.POST和request.params)。多元化   是一个字典,其中一个键可以有多个值。该   典型的例子是一个查询字符串,如?pref = red& pref = blue;该   pref变量有两个值:红色和蓝色。

     

在一个多指单中,当你提出请求时。获取[' pref']你只会回来   '蓝色' (pref的最后一个值)。有时返回一个字符串,和   有时候返回一个列表,是频繁出现异常的原因。如果   如果你想要所有的值,请使用request.GET.getall(' pref')。如果你   想要确保只有一个值,请使用   request.GET.getone(' pref'),如果存在则会引发异常   对于pref。零个或多个值。

http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/webob.html

(您也不应该尝试修改request.params的值,这是只读的。请改用单独的dict。)