我在一个我希望在json渲染的Pyarmid页面中呈现的对象上使用MongoEngine的to_json
方法。我在金字塔中做了很多json渲染,但没有使用MongoEngine。 MongoEngine的to_json
方法简单调用json_util.dumps
。它在Python中运行良好。问题是,当Pyramid呈现页面时,它呈现如下:
{
"0": "\"",
"1": "{",
"2": "\\",
"3": "\"",
"4": "_", etc...
但是,在渲染之前,json转储在Python中看起来不错:
'{"_id": {"$oid": "4ebca43ccc7a67085b000000"}, "created": {"$date": 1346419407715}, "modified": {"$date": 1403757381829}, "modified_by": {"$oid": "4ebca43ccc7a67085b000000"}, "email": etc...
正如评论中所建议的,似乎json不止一次被jsonified,但我无法弄清楚在哪里。
我从数据库中选取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)
除了上面的适配器之外,我自己没有做任何其他的jsonification。那是什么?任何帮助都会很棒。
答案 0 :(得分:0)
感谢@AnttiHappala上面的评论,我发现了问题。 MongoEngine的to_json
方法将对象转换为jsonified字符串。但是,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对象添加一个自定义渲染器并将其原生返回。