0

python とピラミッド/パイロンへの newb。ユーザーがログインした後、データベース内のデータを取得してセッション変数に保存したいと考えています。ユーザーのログインIDをremember()で保存できました。request.session を使用すると、文字列であればセッション変数を設定できますが、データベースから何かを取得しようとすると、「BadPickleGet: �」というエラーが発生します。これが私の見解の関連部分です:

if 'form.submitted' in request.params:
        login = request.params['login']
        password = request.params['password']
        if User.check_password(login, password):
            headers = remember(request, login) # ie dave
            session = request.session
            #session['myvar'] = 'somethinghardcoded' # this works!
            session['myvar'] = User.myfield # this doesn't work!
            session.save()
            return HTTPFound(location=came_from, headers=headers)
4

2 に答える 2

5

あなたの例ではUser、データベースからロードしたインスタンスを扱っていません。これは次のようになりますuser = DBSession.query(User).filter_by(login).first()User.myfieldとの間には大きな違いがあります。1 つuser.myfield目は単なるColumnオブジェクトまたはプロパティであり、2 つ目はデータベース内の特定の行の実際のデータです。あなたのエラーは、おそらくColumnオブジェクトをピクルできないことです。セッションは、プリミティブ型 (int、string など) を問題なくピクルできます。

于 2012-09-26T14:09:13.903 に答える
0

ピラミッド セッション:

セッション データのキーと値は、ピクル可能である必要があります。これは通常、それらが文字列、リスト、辞書、タプル、整数などの基本的なタイプのオブジェクトのインスタンスであることを意味します。ピクル可能でないセッション データ キーまたは値にオブジェクトを配置すると、エラーが発生します。セッションがシリアル化されるときに発生します。

つまり、データをピクルすることはできず、ピクルできる形式でデータを返すメソッドを提供する必要があります (私は というメソッドを作成するのが好きtodict()です)。

しかし、2 つ目の問題があるようです。

[...]データベースに?

デフォルトのセッション ファクトリ (使用していると思われます) は、データをデータベースに保存するのではなく、Cookie (暗号化されていない場所) に保存します。ここであなたにとって正しいことかもしれません。その場合でも、ピクルス化できるデータ (辞書、リスト、文字列など) が必要だと思いますが、Cookie ではなくデータベースにあるので、機密情報を保存できます (やらないでください)。これはデフォルトです!) 長さの制限を取り除きます (Cookie の場合は 4kB)。

于 2012-09-26T09:17:00.070 に答える