Python:使用 Tornado 的 get_argument 处理 pyMongo 的 ObjectId
Python: Handle pyMongo's ObjectId with Tornado's get_argument
我正在使用 python、tornadoweb 和 MongoDB 构建 REST api。
我正在寻找一种尽可能以最少的操作和最简单的 API 来处理客户端-服务器文档交换的简单方法。我在将 MongoDB 的 ObjectId 序列化和反序列化为 JSON 到 send/receive 数据进出客户端时遇到问题。
我知道有两种方法可以解决这个问题:
- 配置 MongoDB 通过 SONManipulators 使用字符串 _id 字段而不是 ObjectId (Configure pymongo to use string _id instead of ObjectId)
- 使用 json_utils 模块将 ObjectId 转换为 json 字符串
{"$oid": "..."}
(Unable to deserialize PyMongo ObjectId from JSON)
None 这些解决方案似乎是可以接受的,因为:
- MongoDB 使用 ObjectId 而不是字符串是有原因的(参见:MongoDb: Benefit of using ObjectID vs a string containing an Id?)
如果服务器发送文档的id,语法为{"$oid": "..."}
,当客户端不做任何修改发回此id时,tornado的get_argument
功能将无法使用正确处理它接收到的数据:
> arguments: {'_id[$oid]': ['54f9c7ab834bac1b76846655'], ...}
> POST [...] (127.0.0.1): Missing argument _id
知道如何优雅地处理这个问题吗?优雅地我的意思是我想以一种与如果 id 是一个简单字符串时我会做的最相似的方式来处理 id。
非常感谢您的帮助。我做了一些研究,我很惊讶我找不到这个问题的答案,因为 MondoDB 和 tornado 经常一起使用。也许我缺少一个关键字来获得解决方案。
对象 ID(可能还有整个 POST 正文)应编码为 JSON。没有标准的方法可以在表单编码的主体中表示像这样的复杂对象。 jQuery 使用非标准编码 obj[field]=value
,但这并未得到普遍支持,尤其是 Tornado 不支持它。在 Tornado 中使用 jQuery 时,您应该使用 JSON 或 "traditional" 模式(尽管传统模式在这里无济于事,因为它仅适用于列表,不适用于映射)。
我正在使用 python、tornadoweb 和 MongoDB 构建 REST api。 我正在寻找一种尽可能以最少的操作和最简单的 API 来处理客户端-服务器文档交换的简单方法。我在将 MongoDB 的 ObjectId 序列化和反序列化为 JSON 到 send/receive 数据进出客户端时遇到问题。
我知道有两种方法可以解决这个问题:
- 配置 MongoDB 通过 SONManipulators 使用字符串 _id 字段而不是 ObjectId (Configure pymongo to use string _id instead of ObjectId)
- 使用 json_utils 模块将 ObjectId 转换为 json 字符串
{"$oid": "..."}
(Unable to deserialize PyMongo ObjectId from JSON)
None 这些解决方案似乎是可以接受的,因为:
- MongoDB 使用 ObjectId 而不是字符串是有原因的(参见:MongoDb: Benefit of using ObjectID vs a string containing an Id?)
如果服务器发送文档的id,语法为
{"$oid": "..."}
,当客户端不做任何修改发回此id时,tornado的get_argument
功能将无法使用正确处理它接收到的数据:> arguments: {'_id[$oid]': ['54f9c7ab834bac1b76846655'], ...} > POST [...] (127.0.0.1): Missing argument _id
知道如何优雅地处理这个问题吗?优雅地我的意思是我想以一种与如果 id 是一个简单字符串时我会做的最相似的方式来处理 id。
非常感谢您的帮助。我做了一些研究,我很惊讶我找不到这个问题的答案,因为 MondoDB 和 tornado 经常一起使用。也许我缺少一个关键字来获得解决方案。
对象 ID(可能还有整个 POST 正文)应编码为 JSON。没有标准的方法可以在表单编码的主体中表示像这样的复杂对象。 jQuery 使用非标准编码 obj[field]=value
,但这并未得到普遍支持,尤其是 Tornado 不支持它。在 Tornado 中使用 jQuery 时,您应该使用 JSON 或 "traditional" 模式(尽管传统模式在这里无济于事,因为它仅适用于列表,不适用于映射)。