0
from bson.json_util import dumps
def json_response(response):
return {"response":dumps(response,ensure_ascii=False).encode("utf8")
        ,"headers":{"Content-type":"text/json"}}

这个问题让我抓狂。它随机返回错误,我找不到解决方案。

/core/handlers/wsgi.py", line 38, in __call__, 
output = lookup_view(req), 
File "auth/decorator.py", line 8, in wrap, 
return fn(req,*args,**kwargs),
File "auth/decorator.py", line 21, in wrap, 
return fn(req,*args,**kwargs),
File "contrib/admin/views.py", line 67, in submit_base_premission,
return json_response({"baseperm":baseperm,"Meta":{"gmsg":u"...","type":201}}),
File "render/render_response.py", line 85, in json_response, 
return {"response":dumps(response,ensure_ascii=False).encode("utf8"),
File "/usr/local/lib/python2.7/dist-packages/bson/json_util.py", line 116, in dumps,
return json.dumps(_json_convert(obj), *args, **kwargs), 
File "/usr/lib/python2.7/json/__init__.py", line 238, in dumps, referer: 
**kw).encode(obj), 
File "/usr/lib/python2.7/json/encoder.py", line 201, in encode, 
chunks = self.iterencode(o, _one_shot=True), 
File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode, 
return _iterencode(o, 0), 
File "/usr/lib/python2.7/json/encoder.py", line 178, in default, 
raise TypeError(repr(o) + " is not JSON serializable"), 
TypeError: ObjectId('51f7dcee95113b7a48e974fe') is not JSON serializable, 

baseperm是一个 pymongo Cursor,它随机返回此错误,这就是我遇到问题的地方。似乎它objectid有时不会检测到并且不会将其转换为str因此 json 在转储时引发错误。

4

2 回答 2

1

检查 pymongo 驱动程序的版本,如果它在 2.4.2+ 版本以下,那么您可能需要更新它。在该版本之前,2.x版本的 python的__str__方法ObjectId处理不正确,请检查 repo: github,ObjectId。应该在 2.x 中返回 str。__str__

要检查 pymongo 驱动程序版本,请输入 python shell:

import pymongo
print(pymongo.version)

更新

我想你已经用相同的数据集测试了两个环境,所以尝试将 python 升级2.7.32.7.5.

否则尝试遍历游标并在将其提供给json_response()ie 之前构造列表:

baseperm = list(baseperm) #now baseperm is a list of the documents

...
my_response['baseperm'] = baseperm
my_response['Meta'] = ...
...

return json_response(my_response)
于 2013-08-01T23:11:17.450 回答
0

我在 mongodb 问题跟踪器 https://jira.mongodb.org/browse/PYTHON-548上报告了这个问题

回答:

你说这只是偶尔发生?我能想到的唯一可能相关的是 mod_wsgi 产生子解释器。在 PyMongo 中,这往往会导致将 python dicts 编码为 BSON 的 C 扩展出现问题。在您的情况下,这似乎发生在 BSON 文档被解码为 python dicts 之后。看起来 isinstance 无法匹配 json_util.default() 中的 ObjectId。PYTHON-539似乎是与用户环境中的某些包未命中配置相关的类似问题。

可能会对性能造成相当大的影响,但是您可以尝试在没有 C 扩展的情况下运行 PyMongo 以查看是否可以解决问题?

您可以在此处阅读有关 mod_wsgi 问题的信息:

http://api.mongodb.org/python/current/faq.html#does-pymongo-work-with-mod-wsgi

于 2013-08-06T05:39:35.723 回答