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会在转储时引发错误。
答案 0 :(得分:1)
检查pymongo驱动程序的版本,如果它在版本2.4.2+以下,那么您可能需要更新它。在该版本之前,__str__
ObjectId
方法对于 2.x 版本的python处理不正确,请检查回购:github, ObjectId.__str__
should return str in 2.x.
要检查pymongo驱动程序版本,请输入python shell:
import pymongo
print(pymongo.version)
<强>更新强>
我想您已使用相同的数据集测试了两个环境,因此请尝试将python 2.7.3
升级到2.7.5
。
否则尝试迭代游标并构建列表,然后将其提供给json_response()
,即:
baseperm = list(baseperm) #now baseperm is a list of the documents
...
my_response['baseperm'] = baseperm
my_response['Meta'] = ...
...
return json_response(my_response)
答案 1 :(得分:0)
我在mongodb问题跟踪器上报告此问题 https://jira.mongodb.org/browse/PYTHON-548
答案:
你说这只是偶尔发生的事吗?我唯一能想到的可能与mod_wsgi产生子解释器有关。在PyMongo中,往往会导致编码python dicts的C扩展到BSON的问题。在你的情况下,这似乎是在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