17: セッションを使用したトランジェントデータ(17: Transient Data Using Sessions)¶
Pyramidのセッションで非永続データを取得して保存します。
背景(Background)¶
Webアプリケーションを使用する人は、半永久的なデータを保存する必要があるタスクを頻繁に実行します。たとえば、ショッピングカートです。これは session と呼ばれます。
Pyramidniはセッションのための基本的な組み込みサポートがあります。pyramid_redis_sessions などのサードパーティ製パッケージはセッションのより豊富なサポートを提供します 。または独自のカスタムセッションエンジンを作成できます。built-in sessioning support を参照してみてください。
目的(Objectives)¶
- 組み込みのシンプルなPyramidセッションシステムを使用して、セッションファクトリを作成します。
- セッションを使用するようにコードを修正します。
手順(Steps)¶
最初に
view_classes
での結果をコピーします:$ cd ..; cp -r view_classes sessions; cd sessions $ $VENV/bin/pip install -e .
sessions/tutorial/__init__.py
は configurator に登録するためのセッションファクトリを選択する必要があります: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()
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'}
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>
テストも実行できるようにします:
$ $VENV/bin/py.test tutorial/tests.py -q .... 4 passed in 0.42 seconds
Pyramidアプリケーションを以下のように実行します:
$ $VENV/bin/pserve development.ini --reload
http://localhost:6543/ と http://localhost:6543/howdy をブラウザで開きます。リロードしてURL間を切り替えるとカウンタが増加します。カウンタがURLに固有のものではないことに注意してください。
アプリケーションを再起動してページに再度アクセスしてください。カウンタが中断していた値から増加する点に注目してください。
分析(Analysis)¶
Pyramidの request オブジェクトに、ビューコードで使用できる session
アトリビュートが追加されました。 session
アトリビュートは辞書型のように機能します。
すべてのビューが同じカウンタを使用しているので、カウンタをビュークラスのレベルでPythonプロパティにしました。 これにより各ビューでのリロードによってテンプレートに表示されるカウンタが増加します。
ウェブ開発での「flashメッセージ」は未来のウェブリクエストの後に画面に表示する必要のあるユーザのためのメモである。 たとえばフォームの POST
を使用してアイテムを追加する場合は通常のWebサイトでは新しいアイテムを表示するために2番目のHTTPリダイレクトWebリクエストを発行します。2番目のウェブリクエストで「あなたの商品が追加されました」とメッセージが表示されることがあります。 POSTのWebレスポンスで返すことはできません。これは2回目のWebリクエストで捨てられるからです。
flashメッセージはセッションを使用してリクエスト間でメッセージを保存します。その後に表示されたときにメッセージを削除して途中でメッセージを取り出せるようにするテクニックです。
参考