Python Pyramid未正确渲染JSON
我在使用MongoEngine的to_json
方法,想把一个对象显示在用json格式渲染的Pyramid页面上。我在Pyramid中做过很多json渲染,但没有用过MongoEngine。MongoEngine的to_json
方法其实就是调用json_util.dumps
。在Python中一切都运行得很好。问题是,当Pyramid渲染页面时,结果是这样的:
{
"0": "\"",
"1": "{",
"2": "\\",
"3": "\"",
"4": "_", etc...
不过,在渲染之前,Python中的json输出看起来是没问题的:
'{"_id": {"$oid": "4ebca43ccc7a67085b000000"}, "created": {"$date": 1346419407715}, "modified": {"$date": 1403757381829}, "modified_by": {"$oid": "4ebca43ccc7a67085b000000"}, "email": etc...
正如评论中提到的,似乎json被处理了不止一次,但我找不到原因。
我从数据库中获取User
对象,并在每次请求时都附加它:
def get_user(request):
return User.objects(id=ObjectId(authenticated_userid(request))).first()
config.add_request_method(get_user, 'user', reify=True)
我根据请求返回用户信息:
@view_config(route_name='api.user', permission='authenticated', renderer='json')
def user_vc(request):
response = request.response
_id = request.matchdict['id']
if _id == 'session':
user = request.user
if not user:
response.status = 403
return response
else:
print user # user object as expected (not json)
return user
我有一个自定义适配器来处理User
对象:
# custom json adapters
custom_json = JSON()
def user_adapter(obj, request):
print obj.to_json() # the json looks ok here
return obj.to_json()
custom_json.add_adapter(User, user_adapter)
config.add_renderer('json', custom_json)
除了上面的适配器,我没有做其他的json处理。那么问题出在哪里呢?任何帮助都很棒。
1 个回答
0
感谢@AnttiHappala的评论,我找到了问题所在。MongoEngine的to_json
方法是用来把对象转换成一个字符串格式的JSON。但是,Pyramid需要的是一个JSON数据结构。所以,为了解决这个问题,我在我的自定义渲染器里添加了以下这个函数:
def render_to_json(obj):
return json.loads(obj.to_json())
def user_adapter(obj, request):
return render_to_json(obj)
custom_json.add_adapter(User, user_adapter)
现在我可以为其他MongoEngine对象添加自定义渲染器,并且可以直接返回它们。