17: セッションを使用したトランジェントデータ(17: Transient Data Using Sessions)

Pyramidのセッションで非永続データを取得して保存します。

背景(Background)

Webアプリケーションを使用する人は、半永久的なデータを保存する必要があるタスクを頻繁に実行します。たとえば、ショッピングカートです。これは session と呼ばれます。

Pyramidniはセッションのための基本的な組み込みサポートがあります。pyramid_redis_sessions などのサードパーティ製パッケージはセッションのより豊富なサポートを提供します 。または独自のカスタムセッションエンジンを作成できます。built-in sessioning support を参照してみてください。

目的(Objectives)

  • 組み込みのシンプルなPyramidセッションシステムを使用して、セッションファクトリを作成します。
  • セッションを使用するようにコードを修正します。

手順(Steps)

  1. 最初に view_classes での結果をコピーします:

    $ cd ..; cp -r view_classes sessions; cd sessions
    $ $VENV/bin/pip install -e .
    
  2. sessions/tutorial/__init__.pyconfigurator に登録するためのセッションファクトリを選択する必要があります:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    from pyramid.config import Configurator
    from pyramid.session import SignedCookieSessionFactory
    
    
    def main(global_config, **settings):
        my_session_factory = SignedCookieSessionFactory(
            'itsaseekreet')
        config = Configurator(settings=settings,
                              session_factory=my_session_factory)
        config.include('pyramid_chameleon')
        config.add_route('home', '/')
        config.add_route('hello', '/howdy')
        config.scan('.views')
        return config.make_wsgi_app()
    
  3. sessions/tutorial/views.py のビューでは request.session を使用できます:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    from pyramid.view import (
        view_config,
        view_defaults
        )
    
    
    @view_defaults(renderer='home.pt')
    class TutorialViews:
        def __init__(self, request):
            self.request = request
    
        @property
        def counter(self):
            session = self.request.session
            if 'counter' in session:
                session['counter'] += 1
            else:
                session['counter'] = 1
    
            return session['counter']
    
    
        @view_config(route_name='home')
        def home(self):
            return {'name': 'Home View'}
    
        @view_config(route_name='hello')
        def hello(self):
            return {'name': 'Hello View'}
    
  4. sessions/tutorial/home.pt のテンプレートでは値を表示できます:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <title>Quick Tutorial: ${name}</title>
    </head>
    <body>
    <h1>Hi ${name}</h1>
    <p>Count: ${view.counter}</p>
    </body>
    </html>
    
  5. テストも実行できるようにします:

    $ $VENV/bin/py.test tutorial/tests.py -q
    ....
    4 passed in 0.42 seconds
    
  6. Pyramidアプリケーションを以下のように実行します:

    $ $VENV/bin/pserve development.ini --reload
    
  7. http://localhost:6543/http://localhost:6543/howdy をブラウザで開きます。リロードしてURL間を切り替えるとカウンタが増加します。カウンタがURLに固有のものではないことに注意してください。

  8. アプリケーションを再起動してページに再度アクセスしてください。カウンタが中断していた値から増加する点に注目してください。

分析(Analysis)

Pyramidの request オブジェクトに、ビューコードで使用できる session アトリビュートが追加されました。 session アトリビュートは辞書型のように機能します。

すべてのビューが同じカウンタを使用しているので、カウンタをビュークラスのレベルでPythonプロパティにしました。 これにより各ビューでのリロードによってテンプレートに表示されるカウンタが増加します。

ウェブ開発での「flashメッセージ」は未来のウェブリクエストの後に画面に表示する必要のあるユーザのためのメモである。 たとえばフォームの  POST を使用してアイテムを追加する場合は通常のWebサイトでは新しいアイテムを表示するために2番目のHTTPリダイレクトWebリクエストを発行します。2番目のウェブリクエストで「あなたの商品が追加されました」とメッセージが表示されることがあります。 POSTのWebレスポンスで返すことはできません。これは2回目のWebリクエストで捨てられるからです。

flashメッセージはセッションを使用してリクエスト間でメッセージを保存します。その後に表示されたときにメッセージを削除して途中でメッセージを取り出せるようにするテクニックです。