python - 在 process_response 上调用 request.session.save 时自定义会话中间件上的 Django 错误
问题描述
Traceback (most recent call last):
File "/home/user/.virtualenvs/env/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/user/.virtualenvs/env/lib/python3.6/site-packages/django/utils/deprecation.py", line 93, in __call__
response = self.process_response(request, response)
File "/home/user/Desktop/project/my_project/app1/middleware.py", line 98, in process_response
request.session.save()
File "/home/user/.virtualenvs/env/lib/python3.6/site-packages/django/contrib/sessions/backends/db.py", line 83, in save
obj = self.create_model_instance(data)
File "/home/user/.virtualenvs/env/lib/python3.6/site-packages/django/contrib/sessions/backends/db.py", line 70, in create_model_instance
session_data=self.encode(data),
File "/home/user/.virtualenvs/env/lib/python3.6/site-packages/django/contrib/sessions/backends/base.py", line 96, in encode
serialized = self.serializer().dumps(session_dict)
File "/home/user/.virtualenvs/env/lib/python3.6/site-packages/django/core/signing.py", line 87, in dumps
return json.dumps(obj, separators=(',', ':')).encode('latin-1')
File "/usr/local/lib/python3.6/json/__init__.py", line 238, in dumps
**kw).encode(obj)
File "/usr/local/lib/python3.6/json/encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/local/lib/python3.6/json/encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "/usr/local/lib/python3.6/json/encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type '__proxy__' is not JSON serializable
我已经request.session.keys
通过记录每个值及其类型来检查这些值。None 是一个__proxy__
对象。此外, str 实际上不太可能是 django 函数。__proxy__
对象或某些翻译对象,因为它会显示。有可能是 django 错误吗?
Django==2.1.4 我正在使用的中间件
class CustomMiddleware(SessionMiddleware):
...
这仅发生在我的一个处理 post 方法并返回 JSON 响应的视图中,因此导致此错误的变量不太可能来自视图,因为它会在调用时显示render_json_response(context)
解决方案
感谢您的评论,帮助我意识到我错过了一些东西。我用这个片段来捕捉错误的变量。
for key in session.keys():
try:
json.dumps(session[key])
catch Exception as e:
print(key)
推荐阅读
- c++ - 为什么破坏后不提示“double free”
- dart - 以异步方式使用 .map()、.where() 等迭代助手?
- cucumber-jvm - 具有两个具有奇怪网络定位器问题的单独场景的功能文件
- bash - 在bash中的X个字符后切断变量
- image - 如何在 TYPO3 中处理图像宽度/高度?
- angular - 通过代码切换 Angular 的 cdkDrag 拖放
- mysql - FireDAC GetTableNames MySQL
- ios - 为什么 autosize collectoinviewcell 不起作用?
- c# - 如何在 MySQL 中插入空白日期/日期时间或占位符而不恢复为空白字符串?
- java - 我如何以纳秒为单位证明我的算法时间