python - 使用 Flask 0.10.1 时获取 'TypeError: ObjectId(' ') 不是 JSON 序列化'

标签 python json flask pymongo

我 fork 了 Flask 示例 Minitwit 以使用 MongoDB,它在 Flask 0.9 上运行良好,但在升级到 0.10.1 后,当我尝试设置 session ID 时登录时出现标题错误。

似乎有 changes在 Flask 0.10.1 中与 json 相关。

代码片段:

user = db.minitwit.user.find_one({'username': request.form['username']})
session['_id'] = user['_id']

我的 github 中的完整代码 repo 。

基本上,我将 Flask session ID 设置为来自 MongoDB 的用户的 _id。

我尝试了这个 SO question 中的前两个解决方案没有成功。

好吧,做 session['_id'] = str(user['_id']) 摆脱了错误消息,我被正确地重定向到时间线页面,但我实际上没有登录。

我该如何解决这个问题?

编辑:复制/粘贴回溯:http://pastebin.com/qa0AL1fk

谢谢。

最佳答案

编辑:更容易修复。您甚至不需要进行任何 JSON 编码/解码。

只需将 session ['_id'] 保存为字符串:

user = db.minitwit.user.find_one({'username': request.form['username']})
session['_id'] = str(user['_id'])

然后无论你想用 session['_id'] 做什么,你都必须用 ObjectId() 包装它,以便它作为 ObjectId 对象传递给 MongoDB。

if '_id' in session:
    g.user = db.minitwit.user.find_one({'_id': session['_id']})

到:

if '_id' in session:
    g.user = db.minitwit.user.find_one({'_id': ObjectId(session['_id'])})

您可以在我的 github repo 上看到修复的完整差异.

如果有人想知道为什么 Flask 0.10.1 中会出现“TypeError: ObjectId('') is not JSON serializable”“问题”,那是因为他们改变了 session 的存储方式。它们现在存储为 JSON,因此由于 MongoDB 中的“_id”对象不是标准的 JSON,它无法序列化 session token ,从而给出 TypeError。在此处了解更改:http://flask.pocoo.org/docs/upgrading/#upgrading-to-010

关于python - 使用 Flask 0.10.1 时获取 'TypeError: ObjectId(' ') 不是 JSON 序列化',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17635015/

相关文章:

python - 如果转置索引具有重复值,则创建新行

python - 将 flask 脚本与模板过滤器一起使用

python - 如何使用conda安装本地包

python - Firestore (python) 监听器完成脚本而不是监听更改

python - 查看 Python 函数的代码

javascript - AngularJS - 级联动态选择列表

Javascript 数组不能作为数组访问

javascript - 配置 dgrid 单元格以显示数据的完整宽度

javascript - Python-Flask AJAX GET 数据不显示在 HTML 页面上

python - 如何在访问日志中添加 Flask 全局 'g' 对象的 id?