Python:使用Tornado的get_argument处理pyMongo的ObjectId

时间:2015-03-06 16:13:46

标签: jquery python mongodb tornado pymongo

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

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

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

  • MongoDB出于某种原因使用ObjectIds而不是字符串(cf:MongoDb: Benefit of using ObjectID vs a string containing an Id?
  • 如果服务器正在发送语法为{"$oid": "..."}的文档的ID,则当客户端在没有任何修改的情况下发回该ID时,龙卷风的get_argument功能将无法使用正确处理收到的数据:

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

有关如何优雅地处理此问题的任何想法?优雅地说,我的意思是我想以一种最类似的方式处理id,如果id是一个简单的字符串,我会做的。

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

1 个答案:

答案 0 :(得分:0)

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