1

Python と Pyramid は初めてです。

ページネーションを行うビューがあります。jsonでエンコードするにはどうすればよいですか?これを試すと、「object at 0x2d16d90> is not JSON serializable」というエラーが表示されます。

@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)
4

2 に答える 2

2

JSON は厳密なテキスト形式です。エンコーダーに SQLAlchemy をスローして、これが正常に機能することを期待することはできません。オブジェクトのエンコーディングがどのようになるかを決定する必要があります。

1 つの方法は、単純な Python 辞書を返す追加のメソッドを SQLAlchemy オブジェクトに実装することです。シリーズ化できるもの。つまり、キーには文字列のみを使用でき、リスト、タプル、数値、および/または文字列のみを含めることができます。

メソッドの例は次のとおりです。

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 では、メソッド hookjsonを介してレンダラーでカスタム オブジェクトをシリアル化するための特定のサポートと、アダプターが変換を行うためのサポートが追加されます。__json__

于 2012-09-22T06:49:05.673 に答える
0

テンプレートをレンダリングして JSON 応答を送信してもよろしいですか? 私は過去にこのようなことをしました:

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

参考までに: それは上記の Django コードです... Pylons に相当するものが何であるかはわかりませんが、調べています...

于 2012-09-22T06:32:10.657 に答える