Python Django request.user.is_验证引发字典更新序列元素#0的长度为X;2是必需的
每次我的代码到达某一行时,它似乎会引发Python Django request.user.is_验证引发字典更新序列元素#0的长度为X;2是必需的,python,django,Python,Django,每次我的代码到达某一行时,它似乎会引发字典更新序列元素#0的长度为X;2是必需的错误。 值X可以更改,但调用该值时几乎总是会引发错误: if request.user.is_authenticated 它是python 3.6.7,django 2.1.7 这是错误堆栈 Traceback: File "/path/to/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner 34.
字典更新序列元素#0的长度为X;2是必需的
错误。
值X可以更改,但调用该值时几乎总是会引发错误:
if request.user.is_authenticated
它是python 3.6.7,django 2.1.7
这是错误堆栈
Traceback:
File "/path/to/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)
File "/path/to/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
126. response = self.process_exception_by_middleware(e, request)
File "/path/to/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
124. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "./playerdata/api/tokens.py" in token_queries
87. if request.user.is_authenticated:
File "/path/to/venv/lib/python3.6/site-packages/django/utils/functional.py" in inner
213. self._setup()
File "/path/to/venv/lib/python3.6/site-packages/django/utils/functional.py" in _setup
347. self._wrapped = self._setupfunc()
File "/path/to/venv/lib/python3.6/site-packages/django/contrib/auth/middleware.py" in <lambda>
24. request.user = SimpleLazyObject(lambda: get_user(request))
File "/path/to/venv/lib/python3.6/site-packages/django/contrib/auth/middleware.py" in get_user
12. request._cached_user = auth.get_user(request)
File "/path/to/venv/lib/python3.6/site-packages/django/contrib/auth/__init__.py" in get_user
189. user = backend.get_user(user_id)
File "/path/to/venv/lib/python3.6/site-packages/django/contrib/auth/backends.py" in get_user
98. user = UserModel._default_manager.get(pk=user_id)
File "/path/to/venv/lib/python3.6/site-packages/django/db/models/manager.py" in manager_method
82. return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/path/to/venv/lib/python3.6/site-packages/django/db/models/query.py" in get
390. clone = self.filter(*args, **kwargs)
File "/path/to/venv/lib/python3.6/site-packages/django/db/models/query.py" in filter
844. return self._filter_or_exclude(False, *args, **kwargs)
File "/path/to/venv/lib/python3.6/site-packages/django/db/models/query.py" in _filter_or_exclude
862. clone.query.add_q(Q(*args, **kwargs))
File "/path/to/venv/lib/python3.6/site-packages/django/db/models/sql/query.py" in add_q
1263. clause, _ = self._add_q(q_object, self.used_aliases)
File "/path/to/venv/lib/python3.6/site-packages/django/db/models/sql/query.py" in _add_q
1289. joinpromoter.add_votes(needed_inner)
File "/path/to/venv/lib/python3.6/site-packages/django/db/models/sql/query.py" in add_votes
2171. self.votes.update(votes)
File "/usr/lib/python3.6/collections/__init__.py" in update
620. super(Counter, self).update(iterable) # fast path when counter is empty
Exception Type: ValueError
Exception Value: dictionary update sequence element #0 has length 9; 2 is required
编辑:其他信息
我必须明确指出,这个错误每天都会触发一次,这是我在网站上活动的高峰期。一旦它被触发,它将在停止之前持续发送垃圾邮件几个小时。
它也不仅仅发生在tokens、py文件中,而且几乎发生在用户试图访问的代码中的任何地方
更新:与负载平衡有关
该错误似乎与负载平衡有关。当错误开始发送垃圾邮件时,一次只会在其中一个LB节点上发生。
我发现从负载平衡器中取出一个节点可以阻止它的发生它甚至不必是发生错误的节点!
如果我将两个节点都重新打开,错误会立即再次触发
例如:
- 节点1开始向错误发送垃圾邮件
- 我将节点2从LB中取出
- 错误停止
- 将节点2备份,错误垃圾邮件将立即重新启动
只是基于负载平衡和会话评论的一种预感。我可以识别错误跟踪中的异常行: 在正常情况下,不得到达该线。 如果您查看“collections/\uuuuu init\uuuuuuu.py”中的
如果isinstance(iterable,映射):
...
超级(计数器,自身)。更新(可编辑)#计数器为空时的快速路径
变量iterable
是从变量needed\u inner
在功能上。其类型应始终为
。因此,isinstance(iterable,Mapping)
永远不应该是True
正如您所说,您没有使用自定义的
AUTH\u USER\u模型
。因此,最合理的解释是Nginx-WSGI-python实现中隐藏的bug(可能与负载平衡有关)。@dirkgroten添加了代码。这个错误几乎发生在我尝试获取用户的所有地方。使用django.contrib.sessions.middleware.SessionMiddleware
,一个SESSION\u后端没有做任何更改。不幸的是,这个bug只发生在生产环境中,我无法在本地复制它以使用断点。它也可以连续几天正常工作,但是突然被触发,并在最后停止之前发送几个小时的错误消息…查看Django代码,我认为如果会话中出现错误,可能会触发此错误。会话表中可能有损坏的条目。您可能希望清除过期的会话(如果您没有一个cron作业已经定期这样做了)然后直接查看生产环境中的db sessions表,看看是否可以发现损坏的行。实际上,您应该在失败语句周围添加一个try,以便在引发异常时将一些额外信息打印到日志中。例如,记录请求会话cookie,以便以后可以在生产中的shell中检索该会话。是什么让您认为它来自损坏的会话条目?事实上,我曾经也有过这样的错误,因为另一个错误说,'SessionStore'对象没有属性“\u session\u cache”
,所以您可能会发现一些东西。两个节点都有完全相同的代码(同步存储库)。如果密钥错误,错误会一直发生,而不是周期性地发生,对吗?同意,看起来很奇怪,对我来说同样的问题,密钥是稳定的
def token_queries(request):
data = None
if request.user.is_authenticated:
data = login_required(request)
if data is None:
data = anonymous(request)
return json_response(data)
File "/usr/lib/python3.6/collections/__init__.py" in update
620. super(Counter, self).update(iterable) # fast path when counter is empty