authomatic:不推荐使用REQUEST /返回的状态与存储的状态不匹配

时间:2016-05-04 11:29:07

标签: python django authomatic

我遇到了阻塞问题:我正在使用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

3 个答案:

答案 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]