偏った言語信者の垂れ流し

2014-06-22

[][]Django 1.5.3以降で変更されたセッションシリアライズについて

Djangoセッションデータは、settings.SESSION_ENGINEで指定されたクラスによって保存されます。

Django 1.5.3より前のバージョンでは、セッションデータのオブジェクトシリアライズ、デシリアライズする処理は、ここで指定されるバックエンドクラスに任されていました。

デフォルトでは、pickleモジュールでダンプして、ハッシュ値+base64エンコードした文字列になっていました。

Django 1.5.3以降では、このpickleモジュールでダンプしていた部分が分離され、新たにsettings.SESSION_SERIALIZERという設定項目が追加されました。

SESSION_SERIALIZER

Django 1.5.3以降の1.5系では、settingsにSESSION_SERIALIZERを指定しない場合は従来通りpickleモジュールが使用されます。

また、Django 1.6では、デフォルトシリアライザが、jsonモジュールを使ってダンプするJSONSerializerに変更されました。

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

JSONSerializerの場合、jsonモジュールのdumpsでシリアライズできないオブジェクトセッションに入れると、保存できずエラーになります。

例えば、Pythonのobjectクラスを継承したインスタンスや、その他jsonモジュールが対応していない値の型、データ構造などが該当します。

Django 1.6以降で従来通り、Python任意オブジェクトを保存したい場合は、settings.SESSION_SERIALIZERにPickleSerializerを指定するとよいでしょう。

SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

Python以外で作られた別のシステムと連携するのであれば、pickleデータは扱いづらい可能性が高いので、JSONSerializerを使うか、その他自前でシリアライザを作成するとよいでしょう。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/nullpobug/20140622/1403436740