Python Pyramid未正确渲染JSON

0 投票
1 回答
873 浏览
提问于 2025-04-18 11:08

我在使用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对象添加自定义渲染器,并且可以直接返回它们。

撰写回答