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)
答案 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])
这会返回一个包含name
和phone
个字词的字典,其中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 hook在json
渲染器中序列化自定义对象的特定支持,以及支持适配器为您进行转换。
答案 1 :(得分:0)
您确定要渲染模板以发送JSON响应吗?我过去做过这样的事情:
return HttpResponse(
json.dumps(customers),
status=200,
mimetype="application/json")
仅供参考:上面的那个Django代码......我不确定Pylons的等价物是什么,但是我正在查找它......