(機械翻訳) セッション

A:term: `session`は、Webアプリケーションとのユーザーの対話を表現するために使用できる一定期間の継続的な活動に対して有効な名前空間です。

この章では、セッションの設定方法、セッションの実装方法について説明します。app: `Pyramid`は、即座に提供され、セッションからのデータの保存および取得方法、およびセッション固有の機能です。

デフォルトセッションファクトリの使用

セッションを使用するには、:app: Pyramid`設定中に:term: session factory`を設定する必要があります。

非常に基本的で安全でないサンプルセッションファクトリの実装は、:app: `Pyramid`コアで提供されています。セッション情報を保存するためにクッキーを使用します。この実装には次の制限があります。

  • この実装で使用されるクッキー内のセッション情報は暗号化されていない*ため、ユーザーのブラウザのクッキーストレージまたはクッキーが移動するネットワークにアクセスできる人は誰でも閲覧できます。
  • セッションのシリアライズされた表現で格納可能な最大バイト数は4000未満です。これは非常に小さいデータセットにのみ適しています。

しかし、それはデジタル署名されているため、そのデータを簡単に改ざんすることはできません。

このセッションファクトリは:app: Pyramid`アプリケーションで:meth: pyramid.config.Configurator.set_session_factory`メソッドを使って設定できます。

1
2
3
4
5
6
from pyramid.session import SignedCookieSessionFactory
my_session_factory = SignedCookieSessionFactory('itsaseekreet')

from pyramid.config import Configurator
config = Configurator()
config.set_session_factory(my_session_factory)

警告

デフォルトでは:func: `〜pyramid.session.SignedCookieSessionFactory`実装は*暗号化されていません*。アプリケーションのユーザーとユーザーのネットワークトラフィックにアクセスできる第三者が情報を簡単に読むことができるため、セッションオブジェクトに機密情報を保存するときには使用しないでください。セッションデータがCookieに暗号化されて保存されているため、このセッション実装を使用してアプリケーションでクロスサイトスクリプティングの脆弱性を誤って作成した場合、悪意のあるユーザーが現在のユーザーのクロスサイトスクリプティングトークン。要するに、"セッションセキュリティは重要ではない"というアプリケーションの最も基本的なもの以外は、別のセッションファクトリ実装(好ましくはサーバー上にセッションデータを保持するもの)を使用してください。アプリケーションには、サイトスクリプティングの脆弱性。

セッションオブジェクトの使用

アプリケーション用にセッションファクトリがコンフィグレーションされたら、any:term: request`オブジェクトの `session``属性を介して、セッションファクトリによって提供されるセッションオブジェクトにアクセスできます。例えば:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from pyramid.response import Response

def myview(request):
    session = request.session
    if 'abc' in session:
        session['fred'] = 'yes'
    session['abc'] = '123'
    if 'fred' in session:
        return Response('Fred was in the session')
    else:
        return Response('Fred was not in the session')

このビューが初めて呼び出されると、「フレッドはセッションに参加していません」と表示されます。その後の呼び出しでは、クライアント側が複数の要求にまたがってセッションの識別情報を保持していることを前提として、「Fredがセッション中です。

あなたはPython辞書のようにセッションを使うことができます。それはいくつかの追加の属性とメソッドと共に、すべての辞書メソッドをサポートしています。

追加属性:

``作られた ``
このセッションが作成された時刻を示す整数のタイムスタンプ。
「新」
ブール値`` new``がTrueの場合、このセッションは新規です。それ以外の場合は、既にシリアライズされたデータから構成されています。

余分な方法:

`` changed() ``
セッションネームスペース内の変更可能な値を変更するときにこれを呼び出します。これをいつ、なぜ呼び出すべきかについての詳細は、下の問題点を参照してください。
`` invalidate() ``
セッションを無効にする(すべてのデータをダンプし、おそらくクリアクッキーを設定する)ときにこれを呼び出します。

セッションオブジェクトがサポートするメソッドと属性の正式な定義は:class: `pyramid.interfaces.ISession`のドキュメントにあります。

いくつかの問題:

  • セッションデータのキーと値は* pickleable *でなければなりません。これは、通常、文字列、リスト、辞書、タプル、整数などのオブジェクトの基本型のインスタンスであることを意味します。オブジェクトをpickleableではないセッションデータキーまたは値に配置すると、エラーが発生しますセッションがシリアライズされるときに発生します。
  • セッションオブジェクトに変更可能な値(リストや辞書など)を入れた後、その値を変更する場合は、セッションオブジェクトの `` changed() メソッドを呼び出す必要があります。この場合、セッションは変更されたことを知る方法がありません。しかし、セッションオブジェクトを直接変更する場合(例えば、 `` __setitem__)、キーを削除する場合( `` del``や `` pop``など)には、セッションは自動的にそのデータを再シリアライズする必要があるため、 `` changed() ``を呼び出すことは不要です。いずれにしても `` changed() ``を呼び出すことには何の害もないので、疑わしいときはセッションデータを変更した後に呼び出してください。

代替セッションファクトリの使用

この執筆時点では、以下のセッションファクトリが存在します。

セッションファクトリー バックエンド 説明
pyramid_nacl_session PyNaCl PyNaClを使用してCookie状態の対称暗号化を生成する、暗号化されたpickleベースのCookieシリアライザを定義します。
pyramid_redis_sessions Redis Pyramid用のサーバー側のセッションライブラリ。Redisをストレージに使用します。
ピラミッドビーカー ビーカー ビーカーのセッションシステムに支えられたピラミッドのセッションファクトリ。

独自のセッションファクトリーを作成する

もし:app: Pyramid`のためのデフォルトやその他のセッションの実装があなたに合っていないなら、:term: session factory`を実装することであなた自身のセッションオブジェクトを作成できます。あなたのセッションファクトリは:term: session`を返すべきです。両方の型のインタフェースはclass: `pyramid.interfaces.ISessionFactory`と:class: pyramid.interfaces.ISession`で利用できます。 :mod: `pyramid.session`モジュールのcookie実装をインスピレーションとして使うかもしれません。

フラッシュメッセージ

"Flash messages "は:term: session`に格納されたメッセージ文字列の単なるキューです。フラッシュメッセージを使用するには、:ref: `using_the_default_session_factory`または:ref: using_alternate_session_factories`で説明されているように、:term: `session factory`を有効にする必要があります。

Flashリダイレクトは、内部リダイレクトを実行した後でステータスメッセージを1回だけユーザに表示し、HTMLテンプレートに直接アクセスせずにメッセージをログに記録できるようにします。ユーザインタフェースは、:term: `session`オブジェクトのいくつかのメソッドで構成されています。

`` session.flash``メソッドの使用

フラッシュメッセージキューにメッセージを追加するには、セッションオブジェクトの `` flash() ``メソッドを使用します:

request.session.flash('mymessage')

`` flash() ``メソッドはフラッシュキューにメッセージを追加し、必要に応じてキューを作成します。

`` flash() ``は3つの引数を受け取ります:

flash(message, queue='', allow_duplicate=True)

`` message``引数が必要です。後でユーザーに表示したいメッセージを表します。通常は文字列ですが、あなたが提供する `` message``は決して変更されません。

`` queue``引数は、あなたが提供するメッセージを追加するキューを選択することを可能にします。これを使用して、さまざまな種類のメッセージをフラッシュストレージにプッシュして、後でページの別の場所に表示することができます。キューには任意の名前を渡すことができますが、文字列でなければなりません。各キューは独立していて、 `` pop_flash() ``でポップするか、 `` peek_flash() ``で個別に調べることができます。 `` queue``はデフォルトで空文字列になります。空の文字列は、デフォルトのフラッシュメッセージキューを表します。

request.session.flash(msg, 'myappsqueue')

`` allow_duplicate``引数のデフォルトは `` True``です。これが `` False``で、既にキューに存在するメッセージ値を追加しようとすると、追加されません。

`` session.pop_flash``メソッドの使用

1つまたは複数のメッセージが `` session.flash() APIによってフラッシュキューに追加されると、 session.pop_flash() `APIを使用してキュー全体をポップし、使用するために返すことができます。

特定のキューのメッセージをフラッシュオブジェクトからポップするには、セッションオブジェクトの `` pop_flash() ``メソッドを使用します。これにより、フラッシュキューに追加されたメッセージのリストが返され、キューが空になります。

pop_flash(queue='')
>>> request.session.flash('info message')
>>> request.session.pop_flash()
['info message']

上記のように `` session.pop_flash() ``をもう一度呼び出すと、 `` session.flash() ``に対応する呼び出しは、キューが既にポップされているので空のリストを返します。

>>> request.session.flash('info message')
>>> request.session.pop_flash()
['info message']
>>> request.session.pop_flash()
[]

`` session.peek_flash``メソッドの使用

1つまたは複数のメッセージが `` session.flash() APIによってフラッシュキューに追加されると、 session.peek_flash() APIを使ってそのキューで" peek "を使うことができます。 ` session.pop_flash() ``とは異なり、キューはフラッシュストレージからポップされません。

peek_flash(queue='')
>>> request.session.flash('info message')
>>> request.session.peek_flash()
['info message']
>>> request.session.peek_flash()
['info message']
>>> request.session.pop_flash()
['info message']
>>> request.session.peek_flash()
[]