我怎么对这个视图进行json编码?

时间:2012-09-22 06:24:46

标签: python sqlalchemy pylons pyramid

python和Pyramid的新手。

我有一个分页的观点。我如何对它进行json编码?当我尝试这个时,我收到错误“0x2d16d90& gt;上的对象不是JSON可序列化的”:

@view_config(route_name="paginate")  
def paginate(request):
    query = DBSession.query(MyTable)
    page_url = paginate.PageURL_WebOb(request)
    customers = paginate.Page(query, 
                     page=int(request.params.get("page", 1)), 
                     items_per_page=25, 
                     url=page_url)

    if "partial" in request.params:
        # Render the partial list page
        return render_to_response("templates/my_json.jinja2",
                                  {"customers": json.dumps(customers)},
                                  request=request)
    else:
        # Render the full list page
        return render_to_response("templates/my.jinja2",
                                  {"customers": customers},
                                  request=request)

2 个答案:

答案 0 :(得分:2)

JSON是一种严格的文本格式。你不能只在编码器中抛出SQLAlchemy并期望这是Just Work,你需要决定你的对象的编码是什么样的。

一种方法是让您的SQLAlchemy对象实现一个返回简单python字典的额外方法;一个可以被序列化的。这意味着它只能使用字符串作为键,并且只能包含列表,元组,数字和/或字符串。

示例方法可以是:

def json_dump(self):
    return dict(name=self.name, phone=[p.number for p in self.phonenumbers])

这会返回一个包含namephone个字词的字典,其中phone键包含一个电话号码列表(纯粹用于示例目的)phonenumbers关系。

然后,您可以使用该信息创建json.dumps可以处理的新词典列表:

if "partial" in request.params:
    customer_json_data = [c.json_dump() for c in customers]
    # Render the partial list page
    return render_to_response("templates/my_json.jinja2",
                              {"customers": json.dumps(customer_json_data)},
                              request=request)

即将推出的Pyramid 1.4增加了对通过__json__ method hookjson渲染器中序列化自定义对象的特定支持,以及支持适配器为您进行转换。

答案 1 :(得分:0)

您确定要渲染模板以发送JSON响应吗?我过去做过这样的事情:

return HttpResponse(
        json.dumps(customers),
        status=200,
        mimetype="application/json")

仅供参考:上面的那个Django代码......我不确定Pylons的等价物是什么,但是我正在查找它......