我遇到了阻塞问题:我正在使用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
。
答案 0 :(得分:1)
这是我自己的版本,可能不是最好的,但是v2和v3 python兼容,并且解决了iterlists()
的主要问题:这个函数总是返回一个数组,即使在那里&# 39;只有一个项目。因此,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
答案 1 :(得分:0)
另一种可能的解决方案:
@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())
答案 2 :(得分:0)
谢谢@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]