我面临一个阻塞问题:我使用authomatic 0.1.0,在adapters.py
中有一个属性params
,声明如下:
@property
def params(self):
return dict(self.request.REQUEST)
如果我这样做,我会得到这个阻塞错误:
Erreur #1 : 'WSGIRequest' object has no attribute 'REQUEST'
为此,我在谷歌上搜索的第一个猜测是REQUEST
已经被弃用,所以我试图用这种方式重写它:
@property
def params(self):
# (!) Olivier Pons ! REQUEST removed
a = QueryDict('', mutable=True)
a.update(self.request.GET)
a.update(self.request.POST)
return dict(a.iterlists())
但我明白了:
Erreur #1 : The returned state "[u'cxxxx']" doesn't match with the stored state!
我不知道我做错了什么,也不知道如何"正确"更换REQUEST
。
这是我自己的版本,它可能不是最好的,但兼容v2和v3 python,解决了iterlists()
的主要问题:即使只有一个项,这个函数也总是返回一个数组。所以authomatic在字符串和"一个有一个项的数组"之间进行比较,结果失败了。我的解决方案是:如果只有一个数组有一个项,就保留这个项,而不是数组。
@property
def params(self):
# (!) Olivier Pons ! REQUEST removed
a = QueryDict('', mutable=True)
a.update(self.request.GET)
a.update(self.request.POST)
retour = {}
for key, value in a.iterlists():
if len(value) > 1:
retour[key] = value
else:
retour[key] = value[0]
return retour
另一种可能的解决方案:
@property
def params(self):
if self.request.method == 'POST':
return dict(self.request.POST)
else:
return dict(self.request.GET)
更新:以前的代码不等同于旧的request.RESQUEST
可以使用QueryDict.dict()
:
@property
def params(self):
a = self.request.POST.copy()
a.update(self.request.GET)
return(a.dict())
感谢@Oliver Ponus,我是DJango的新手。。最后你的答案e帮助了我。但如果你把列表值作为参数传递,这个方法就不会得到完整的数据。所以我做了一些小的修改,使其工作
for key, value in item_value.items():
if len(value) > 1:
retour[key]=item_value.getlist(key)
else:
retour[key] = value[0]