07: ビューでの基本的なWeb処理(07: Basic Web Handling With Views)¶
デコレータと複数のビューでビューモジュールを構成する。
背景(Background)¶
これまでの例では、関数 hello_world
は「ビュー」です。PyramidではビューはWebリクエストを受け入れてレスポンスを返す主要な方法です。
これまでの例ではすべてを1つのファイルに格納しています。
- ビュー関数
- コンフィギュレータへの登録
- URLにマップするルート
- WSGIアプリケーションランチャー
ビューを自分の views.py
モジュールに移動してそのモジュールをスキャンするようにスタートアップコードを変更し、ビューを設定するデコレータを探してみましょう。2番目のビューを追加してテストを更新しましょう。
目標(Objectives)¶
- コンフィギュレータでスキャンされたモジュールにビューを移動します。
- 宣言的なコンフィギュレータを行うデコレータを作成します。
手順(Steps)¶
以前のパッケージを新しいディストリビューションの開始点として使用して、アクティブにしてみましょう:
$ cd ..; cp -r functional_testing views; cd views $ $VENV/bin/pip install -e .
views/tutorial/__init__.py
はもっと短くなります:1 2 3 4 5 6 7 8 9
from pyramid.config import Configurator def main(global_config, **settings): config = Configurator(settings=settings) config.add_route('home', '/') config.add_route('hello', '/howdy') config.scan('.views') return config.make_wsgi_app()
リクエストとレスポンスの処理に焦点を当てたモジュール
views/tutorial/views.py
を追加しましょう:1 2 3 4 5 6 7 8 9 10 11 12 13 14
from pyramid.response import Response from pyramid.view import view_config # First view, available at http://localhost:6543/ @view_config(route_name='home') def home(request): return Response('<body>Visit <a href="/howdy">hello</a></body>') # /howdy @view_config(route_name='hello') def hello(request): return Response('<body>Go back <a href="/">home</a></body>')
2つの新しいビューをカバーするようにテストを更新します:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
import unittest from pyramid import testing class TutorialViewTests(unittest.TestCase): def setUp(self): self.config = testing.setUp() def tearDown(self): testing.tearDown() def test_home(self): from .views import home request = testing.DummyRequest() response = home(request) self.assertEqual(response.status_code, 200) self.assertIn(b'Visit', response.body) def test_hello(self): from .views import hello request = testing.DummyRequest() response = hello(request) self.assertEqual(response.status_code, 200) self.assertIn(b'Go back', response.body) class TutorialFunctionalTests(unittest.TestCase): def setUp(self): from tutorial import main app = main({}) from webtest import TestApp self.testapp = TestApp(app) def test_home(self): res = self.testapp.get('/', status=200) self.assertIn(b'<body>Visit', res.body) def test_hello(self): res = self.testapp.get('/howdy', status=200) self.assertIn(b'<body>Go back', res.body)
テストを実行してください:
$ $VENV/bin/py.test tutorial/tests.py -q .... 4 passed in 0.28 seconds
Pyramidアプリケーションを次のように実行してください:
$ $VENV/bin/pserve development.ini --reload
ブラウザで http://localhost:6543/ と http://localhost:6543/howdy を開いてください。
分析(Analysis)¶
さらにいくつかのURLを追加しましたが、アプリケーションのスタートアップコードから tutorial/__init__.py
のビューコードも削除しました。ビューとそのビューの登録(デコレータ経由)は、現在モジュール views.py
経由で config.scan('.views')
でスキャンされています。
私たちには2つのビューがありそれぞれが別のビューにつながります。 http://localhost:6543/ で起動した場合は次のビューへのリンクを持つ応答を得ます。 hello
ビュー(URLで入手可能なビューが /howdy
)は最初のビューへのリンク元があります。
この手順では、URLに表示される名前とURLをビューにマップする「ルート」の名前、およびビューの名前もすべて異なる可能性があります。後ほどルートの詳細があります。
以前は config.add_view
をビューを構成する方法の1つとして見てきました。このセクションでは @view_config
をご紹介します。Pyramidの設定は前の例のような config.add_view
を imperative configuration でサポートしています。Python decorator がビューの上の行に配置される declarative configuration を使用することもできます。どちらの方法も最終的には同じ構成になります。したがって、通常は単にテイストの問題です
エクストラクレジット(Extra credit)¶
- ドット
.views
は何を意味していますか? - なぜ
assertIn
レスポンスのテキストをテストするのが``assertEqual`` よりも良い選択でしょうか?
参考