自动:请求已弃用/返回的状态与存储状态不匹配



我面临一个阻塞问题:我使用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]

最新更新