Python Pyramid无法正确呈现JSON

时间:2014-06-26 07:13:49

标签: python json pyramid mongoengine

我在一个我希望在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。那是什么?任何帮助都会很棒。

1 个答案:

答案 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对象添加一个自定义渲染器并将其原生返回。