将multidict值添加到列表中

1 投票
1 回答
3986 浏览
提问于 2025-04-17 23:50

我正在从一个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 个回答

4

你其实不需要这样做 :) 直接用 request.getall('perm') 就可以了,这样总是会返回一个列表。

WebOb请求的几个属性是“多字典”(multidict),比如 request.GET、request.POST 和 request.params。这种多字典就像一个字典,但一个键可以有多个值。举个例子,比如查询字符串是 ?pref=red&pref=blue;这里的 pref 变量有两个值:red 和 blue。

在多字典中,当你用 request.GET['pref'] 时,你只会得到 'blue'(pref 的最后一个值)。有时候返回的是字符串,有时候返回的是列表,这就容易导致错误。如果你想要所有的值,可以用 request.GET.getall('pref')。如果你想确保只有一个值,可以用 request.GET.getone('pref'),如果 pref 的值为零个或多个,这个方法会报错。

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

(你也不应该尝试修改 request.params 的值,因为它是只读的。可以使用一个单独的字典来代替。)

撰写回答