【问题标题】:Python: Handle pyMongo's ObjectId with Tornado's get_argumentPython:使用 Tornado 的 get_argument 处理 pyMongo 的 ObjectId
【发布时间】:2015-05-08 07:12:32
【问题描述】:

我正在使用 python、tornadoweb 和 MongoDB 构建一个 REST api。 我正在寻找一种简单的方法来处理客户端-服务器文档交换,并尽可能使用最少的操作和最简单的 API。我在将 MongoDB 的 ObjectId 序列化和反序列化为 JSON 以向客户端发送/接收数据时遇到问题。

我知道有两种方法可以解决这个问题:

这些解决方案似乎都不可接受,因为:

  • MongoDB 使用 ObjectIds 而不是字符串是有原因的(参见:MongoDb: Benefit of using ObjectID vs a string containing an Id?
  • 如果服务器发送一个语法为{"$oid": "..."}的文档的id,当客户端不做任何修改地返回这个id时,tornado的get_argument函数不能正确处理它接收到的数据:

    > arguments: {'_id[$oid]': ['54f9c7ab834bac1b76846655'], ...}
    > POST [...] (127.0.0.1): Missing argument _id
    

知道如何优雅地处理这个问题吗?优雅地我的意思是我想以最类似于如果 id 是一个简单的字符串的方式来处理 id。

非常感谢您的帮助。我做了一些研究,很惊讶我找不到这个问题的答案,因为 MondoDB 和 tornado 经常一起使用。也许我错过了一个关键字来获得解决方案。

【问题讨论】:

  • 另一种回答问题的方法是:如何避免jQuery的AJAX调用将对象{obj: {field: 'value'}}序列化为{"obj[field]": "value"}

标签: jquery python mongodb tornado pymongo


【解决方案1】:

对象 ID(可能还有整个 POST 正文)应编码为 JSON。没有标准的方法可以在表单编码的主体中表示这样的复杂对象。 jQuery 使用非标准编码obj[field]=value,但这并不是普遍支持的,尤其是 Tornado 不支持它。当使用 jQuery 和 Tornado 时,您应该使用 JSON 或“传统”模式(尽管传统模式在这里没有帮助,因为它只适用于列表,而不适用于映射)。

【讨论】:

    猜你喜欢
    • 2016-04-21
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    相关资源
    最近更新 更多