07: ビューでの基本的なWeb処理(07: Basic Web Handling With Views)

デコレータと複数のビューでビューモジュールを構成する。

背景(Background)

これまでの例では、関数 hello_world は「ビュー」です。PyramidではビューはWebリクエストを受け入れてレスポンスを返す主要な方法です。

これまでの例ではすべてを1つのファイルに格納しています。

  • ビュー関数
  • コンフィギュレータへの登録
  • URLにマップするルート
  • WSGIアプリケーションランチャー

ビューを自分の views.py モジュールに移動してそのモジュールをスキャンするようにスタートアップコードを変更し、ビューを設定するデコレータを探してみましょう。2番目のビューを追加してテストを更新しましょう。

目標(Objectives)

  • コンフィギュレータでスキャンされたモジュールにビューを移動します。
  • 宣言的なコンフィギュレータを行うデコレータを作成します。

手順(Steps)

  1. 以前のパッケージを新しいディストリビューションの開始点として使用して、アクティブにしてみましょう:

    $ cd ..; cp -r functional_testing views; cd views
    $ $VENV/bin/pip install -e .
    
  2. 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()
    
  3. リクエストとレスポンスの処理に焦点を当てたモジュール 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>')
    
  4. 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)
    
  5. テストを実行してください:

    $ $VENV/bin/py.test tutorial/tests.py -q
    ....
    4 passed in 0.28 seconds
    
  6. Pyramidアプリケーションを次のように実行してください:

    $ $VENV/bin/pserve development.ini --reload
    
  7. ブラウザで 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_viewimperative configuration でサポートしています。Python decorator がビューの上の行に配置される declarative configuration を使用することもできます。どちらの方法も最終的には同じ構成になります。したがって、通常は単にテイストの問題です

エクストラクレジット(Extra credit)

  1. ドット .views は何を意味していますか?
  2. なぜ assertIn レスポンスのテキストをテストするのが``assertEqual`` よりも良い選択でしょうか?