.. Defining Views ================ ビューを定義する ================ .. A :term:`view callable` in a :app:`Pyramid` application is typically a simple .. Python function that accepts a single parameter named :term:`request`. A .. view callable is assumed to return a :term:`response` object. :app:`Pyramid` アプリケーションにおける :term:`view callable` は、 典型的には :term:`request` という名前の 1 つのパラメータを受け取るシンプル な Python 関数です。ビュー callable は :term:`response` オブジェクトを返す ことが想定されます。 .. The request object passed to every view that is called as the result of a .. route match has an attribute named ``matchdict`` that contains the elements .. placed into the URL by the ``pattern`` of a ``route`` statement. For .. instance, if a call to :meth:`pyramid.config.Configurator.add_route` in .. ``__init__.py`` had the pattern ``{one}/{two}``, and the URL at .. ``http://example.com/foo/bar`` was invoked, matching this pattern, the .. ``matchdict`` dictionary attached to the request passed to the view would .. have a ``'one'`` key with the value ``'foo'`` and a ``'two'`` key with the .. value ``'bar'``. ルートマッチの結果として呼び出される全てのビューに渡される request オブ ジェクトは、 ``route`` 文の ``パターン`` によって URL に placed into された 要素が格納されている ``matchdict`` という名前の属性を持っています。 例えば、 ``__init__.py`` の中で行っている :meth:`pyramid.config.Configurator.add_route` の呼び出しに ``{one}/{two}`` というパターンがあり、 ``http://example.com/foo/bar`` という URL が呼び出された場合、このパターンにマッチして、 ``'foo'`` という 値が ``'one'`` というキーに、 ``'bar'`` という値が ``'two'`` というキーに 割り当てられた ``matchdict`` という辞書が request に付け加えられてビューに 渡されます。 .. The source code for this tutorial stage can be browsed at .. `http://github.com/Pylons/pyramid/tree/1.3-branch/docs/tutorials/wiki2/src/views/ .. `_. このチュートリアルステージのソースコードを以下の場所で閲覧することができます。 `http://github.com/Pylons/pyramid/tree/1.3-branch/docs/tutorials/wiki2/src/views/ `_. .. Declaring Dependencies in Our ``setup.py`` File ``setup.py`` ファイルに依存関係を宣言する =============================================== .. The view code in our application will depend on a package which is not a .. dependency of the original "tutorial" application. The original "tutorial" .. application was generated by the ``pcreate`` command; it doesn't know .. about our custom application requirements. 私たちのアプリケーションのビューのコードはオリジナルの "tutorial" アプリケーションの依存関係にはないパッケージに依存しています。オリジナルの "tutorial" アプリケーションは ``pcreate`` によって生成され、私たちの カスタムアプリケーションに必要なものを知りません。 .. We need to add a dependency on the ``docutils`` package to our ``tutorial`` .. package's ``setup.py`` file by assigning this dependency to the ``requires`` parameter in ``setup()``. ``tutorial`` パッケージの ``setup.py`` ファイルでこの依存関係を ``setup`` 関数内の ``requires`` パラメータに割り当てることによって ``docutils`` パッケージへの依存を追加する必要があります。 .. Open ``tutorial/setup.py`` and edit it to look like the following: ``tutorial/setup.py`` ファイルを開き、以下のように編集してください: .. literalinclude:: src/views/setup.py :linenos: :language: python :emphasize-lines: 17 .. (Only the highlighted line needs to be added.) (ハイライトされた行は変更が必要な箇所です) .. Running ``setup.py develop`` ``setup.py develop`` を実行する =============================== .. Since a new software dependency was added, you will need to rerun ``python .. setup.py develop`` inside the root of the ``tutorial`` package to obtain and .. register the newly added dependency distribution. 新しいソフトウェア依存関係が追加されたので、新たに追加された依存パッケージ を登録および取得するために ``tutorial`` パッケージのルート内で ``python setup.py develop`` を再実行する必要があります。 .. Make sure your current working directory is the root of the project (the .. directory in which setup.py lives) and execute the following command. 現在のワーキングディレクトリがプロジェクトのルート (seetup.py のある ディレクトリ) であることを確認して、次のコマンドを実行してください: .. On UNIX: UNIX の場合: .. code-block:: text $ cd tutorial $ ../bin/python setup.py develop .. On Windows: Windows の場合: .. code-block:: text c:\pyramidtut> cd tutorial c:\pyramidtut\tutorial> ..\Scripts\python setup.py develop .. Success executing this command will end with a line to the console something .. like: このコマンドの実行に成功すると、コンソールに次のような出力が行われるでしょう: :: Finished processing dependencies for tutorial==0.0 .. Changing the ``views.py`` File ``views.py`` ファイルを変更する =============================== .. It's time for a major change. Open ``tutorial/tutorial/views.py`` and edit it to look like the following: 大幅な変更をするときが来ました。 ``tutorial/tutorial/views.py`` ファイルを開き、以下のように編集してください: .. literalinclude:: src/views/tutorial/views.py :linenos: :language: python :emphasize-lines: 1-7,12,15-70 .. (The highlighted lines are the ones that need to be added or edited.) (ハイライトされた行は変更が必要な箇所です) .. We got rid of the ``my_view`` view function and its decorator that was .. added when we originally rendered the ``alchemy`` scaffold. It was only an .. example and isn't relevant to our application. ``alchemy`` scaffold を使ってプロジェクトを生成した時に加えられた ``my_view`` ビュー関数とそのデコレータを取り除きました。それは単なる 例で、このアプリケーションには適切ではありません。 .. Then we added four :term:`view callable` functions to our ``views.py`` .. module: そして、 ``views.py`` モジュールに4つの :term:`view callable` 関数を 追加しました: .. * ``view_wiki()`` - Displays the wiki itself. It will answer on the root URL. .. * ``view_page()`` - Displays an individual page. .. * ``add_page()`` - Allows the user to add a page. .. * ``edit_page()`` - Allows the user to edit a page. * ``view_wiki()`` - wiki 自体を表示します。それはルート URL の上で答えます。 * ``view_page()`` - 個々のページを表示します。 * ``add_page()`` - ページの追加を可能にします。 * ``edit_page()`` - ページの編集を可能にします。 .. We'll describe each one briefly and show the resulting ``views.py`` file .. afterward. 各々について簡潔に記述し、結果の ``views.py`` ファイルを後で示します。 .. .. note:: .. There is nothing special about the filename ``views.py``. A project may .. have many view callables throughout its codebase in arbitrarily-named .. files. Files implementing view callables often have ``view`` in their .. filenames (or may live in a Python subpackage of your application package .. named ``views``), but this is only by convention. .. note:: ``views.py`` というファイル名に特別な意味はありません。プロジェクト はそのコードベース全体で任意の名前のファイル中に多くのビューを持つこ とができます。ビューを実装するファイルは多くの場合 ``view`` というファ イル名を持っています (もしくは ``views`` という名前の アプリケーショ ンパッケージの中の Python サブパッケージに存在しています) が、これは 単なる慣例です。 .. The ``view_wiki`` view function ビュー関数 ``view_wiki`` ------------------------------- .. ``view_wiki()`` is the :term:`default view` that gets called when a request .. is made to the root URL of our wiki. It always redirects to .. a URL which represents the path to our "FrontPage". ``view_wiki()`` は wiki のルート URL に対してリクエストが行われたときに 呼び出される :term:`default view` です。それは常に "FrontPage" へのパス を表す URL にリダイレクトします。 .. literalinclude:: src/views/tutorial/views.py :lines: 18-21 :linenos: :language: python .. ``view_wiki()`` returns an instance of the .. :class:`pyramid.httpexceptions.HTTPFound` class (instances of which implement .. the :class:`pyramid.interfaces.IResponse` interface like .. :class:`pyramid.response.Response` does). ``view_wiki()`` は :class:`pyramid.httpexceptions.HTTPFound` クラスの インスタンスを返します (それは :class:`pyramid.response.Response` のように :class:`pyramid.interfaces.IResponse` インターフェースを実装した インスタンスです) 。 .. It uses the :meth:`pyramid.request.Request.route_url` API to construct a .. URL to the ``FrontPage`` page (e.g. ``http://localhost:6543/FrontPage``), which .. is used as the "location" of the HTTPFound response, forming an HTTP redirect. それは ``FrontPage`` ページの URL (例えば ``http://localhost:6543/FrontPage``) を構築するために :meth:`pyramid.request.Request.route_url` APIを使用します。そして、 それを HTTPFound レスポンスの "location" として使用し、 HTTP リダイレクト を生成します。 .. The ``view_page`` view function ビュー関数 ``view_page`` ------------------------------- .. ``view_page()`` is used to display a single page of our .. wiki. It renders the :term:`ReStructuredText` body of a page (stored as .. the ``data`` attribute of a Page object) as HTML. Then it substitutes an .. HTML anchor for each *WikiWord* reference in the rendered HTML using a .. compiled regular expression. ``view_page()`` は wiki の単一のページを表示するために使用されます。 それは (Page オブジェクトの ``data`` 属性として保存された) :term:`ReStructuredText` で書かれたページの内容を HTML としてレンダリング します。その後、コンパイル済み正規表現を使用して、レンダリング済み HTML 中の各 *WikiWord* 参照を HTML アンカーに置換します。 .. literalinclude:: src/views/tutorial/views.py :lines: 23-43 :linenos: :language: python .. The curried ``check()`` function is used as the first argument to .. ``wikiwords.sub``, indicating that it should be called to provide a value for .. each WikiWord match found in the content. If the wiki already contains a .. page with the matched WikiWord name, ``check()`` generates a view .. link to be used as the substitution value and returns it. If the wiki does .. not already contain a page with with the matched WikiWord name, ``check()`` .. generates an "add" link as the substitution value and returns it. カリー化された関数 ``check()`` は ``wikiwords.sub`` の最初の引数として使 用されます。それはコンテンツ内で見つかった各 WikiWord のマッチに対して 値を提供するために呼び出す必要があると指示しています。もし、マッチした WikiWord 名を持つページが wiki にすでに含まれている場合、 ``check()`` は置換する値として view リンクを生成してそれを返します。もし、マッチした WikiWord 名を持つページがまだ wiki に含まれていない場合、関数は置換する 値として "add" リンクを生成してそれを返します。 .. As a result, the ``content`` variable is now a fully formed bit of HTML .. containing various view and add links for WikiWords based on the content of .. our current page object. この結果、 ``content`` 変数は現在のページオブジェクトの内容に基づいて WikiWord への様々な view または add リンクを含む完全な HTML 形式に なっています。 .. We then generate an edit URL (because it's easier to do here than in the .. template), and we return a dictionary with a number of arguments. The fact .. that ``view_page()`` returns a dictionary (as opposed to a :term:`response` .. object) is a cue to :app:`Pyramid` that it should try to use a :term:`renderer` .. associated with the view configuration to render a template. In our case, .. the template which will be rendered will be the ``templates/view.pt`` .. template, as indicated in the ``@view_config`` decorator that is applied to .. ``view_page()``. その後、 edit URL を生成し (テンプレートの中よりもここで行うほうが簡単だ からです)、いくつかの引数を含む辞書を返します。このビューが (:term:`response` オブジェクトではなく) 辞書を返すという事実は、 テンプレートをレンダリングするためにビュー設定で関連付けられた :term:`renderer` を使用する必要があることを :app:`Pyramid` に知らせます。 この場合、レンダリングされるテンプレートは ``view_page()`` に適用された ``@view_config`` デコレータが示すように ``templates/view.pt`` テンプレート になります。 .. The ``add_page`` view function ビュー関数 ``add_page`` ------------------------------ .. ``add_page()`` is invoked when a user clicks on a *WikiWord* which .. isn't yet represented as a page in the system. The ``check`` function .. within the ``view_page`` view generates URLs to this view. .. ``add_page()`` also acts as a handler for the form that is generated .. when we want to add a page object. The ``matchdict`` attribute of the .. request passed to the ``add_page()`` view will have the values we need .. to construct URLs and find model objects. ``add_page()`` は、まだシステム内のページとして表されていない *WikiWord* をユーザがクリックしたときに呼び出されます。 ``view_page`` ビュー内の ``check`` 関数がこのビューへの URL を生成します。 ``add_page`` はまた、ページオブジェクトを追加するときに生成される フォームのハンドラとして機能します。 ``add_page()`` ビューに渡される リクエストの ``matchdict`` 属性は、 URL の構築とモデルオブジェクトの 検索に必要な値を含んでいます。 .. literalinclude:: src/views/tutorial/views.py :lines: 45-56 :linenos: :language: python .. The ``matchdict`` will have a ``'pagename'`` key that matches the name of .. the page we'd like to add. If our add view is invoked via, .. e.g. ``http://localhost:6543/add_page/SomeName``, the value for .. ``'pagename'`` in the ``matchdict`` will be ``'SomeName'``. ``matchdict`` は追加したいページの名前に一致する ``'pagename'`` キーを 持つことになります。もし、 add ビューが例えば ``http://localhost:6543/add_page/SomeName`` 経由で呼び出された場合、 ``matchdict`` の中の ``'pagename'`` の値は ``'SomeName'`` になります。 .. If the view execution is *not* a result of a form submission (i.e. the .. expression ``'form.submitted' in request.params`` is ``False``), the view .. callable renders a template. To do so, it generates a "save url" which the .. template uses as the form post URL during rendering. We're lazy here, so .. we're going to use the same template (``templates/edit.pt``) for the add .. view as well as the page edit view. To do so we create a dummy Page object .. in order to satisfy the edit form's desire to have *some* page object .. exposed as ``page``. :app:`Pyramid` will render the template associated .. with this view to a response. ビューの実行がフォーム送信の結果では *ない* 場合 (つまり評価式 ``'form.submitted' in request.params`` が ``False`` の場合) 、ビュー callable はテンプレートをレンダリングします。そのために、テンプレート のレンダリング時にフォームのポスト URL として使用される "save url" を 生成します。ここでは手を抜いて、同じテンプレート (``templates/edit.pt``) を追加ビューだけでなく、ページ編集ビューに使用することにします。 ``page`` として公開される *なんらかの* ページオブジェクトを持っていると いう編集フォームの要求を満たすために、ダミー Page オブジェクトを生成します。 そして、 :app:`Pyramid` はレスポンスとしてこのビューに関連付けられている テンプレートをレンダリングします。 .. If the view execution *is* a result of a form submission (i.e. the expression .. ``'form.submitted' in request.params`` is ``True``), we scrape the page body .. from the form data, create a Page object with this page body and the name .. taken from ``matchdict['pagename']``, and save it into the database using .. ``DBSession.add``. We then redirect back to the ``view_page`` view for the .. newly created page. ビューの実行がフォーム送信の結果で *ある* 場合 (つまり評価式 ``'form.submitted' in request.params`` が ``True`` の場合)、 フォームデータからページの本体を取り出し、このページの本体と ``matchdict['pagename']`` から取り出した名前から Page オブジェクトを 生成し、 ``DBSession.add`` を使ってそれをデータベースに保存します。 その後、新しく作成したページの ``view_page`` ビューにリダイレクトします。 .. The ``edit_page`` view function ビュー関数 ``edit_page`` ------------------------------- .. ``edit_page()`` is invoked when a user clicks the "Edit this .. Page" button on the view form. It renders an edit form but it also acts as .. the handler for the form it renders. The ``matchdict`` attribute of the .. request passed to the ``edit_page`` view will have a ``'pagename'`` key .. matching the name of the page the user wants to edit. ``edit_page()`` は、ユーザーが view フォームの "Edit this Page" ボタン をクリックしたときに呼び出されます。 ``edit_page`` は編集フォームを レンダリングしますが、レンダリングしたフォームのハンドラとしても機能します。 ``edit_page`` ビューに渡されるリクエストの ``matchdict`` 属性は、ユーザー が編集するページの名前に一致する ``'pagename'`` キーを持つことになります。 .. literalinclude:: src/views/tutorial/views.py :lines: 58-70 :linenos: :language: python .. If the view execution is *not* a result of a form submission (i.e. the .. expression ``'form.submitted' in request.params`` is ``False``), the view .. simply renders the edit form, passing the page object and a ``save_url`` .. which will be used as the action of the generated form. ビューの実行がフォーム送信の結果では *ない* 場合 (つまり評価式 ``'form.submitted' in request.params`` が ``False`` の場合)、 page オブジェクトと、生成されたフォームのアクションとして使用するための ``save_url`` を渡して単に編集フォームをレンダリングします。 .. If the view execution *is* a result of a form submission (i.e. the expression .. ``'form.submitted' in request.params`` is ``True``), the view grabs the .. ``body`` element of the request parameters and sets it as the ``data`` .. attribute of the page object. It then redirects to the ``view_page`` view .. of the wiki page. ビューの実行がフォーム送信の結果で *ある* 場合 (つまり評価式 ``'form.submitted' in request.params`` が ``True`` の場合)、 リクエストパラメータの ``body`` 要素を取得し、 page オブジェクトの ``data`` 属性としてセットします。次に wiki ページの ``view_page`` ビューにリダイレクトします。 .. Adding Templates テンプレートの追加 ================== .. The views we've added all reference a :term:`template`. Each template is a .. :term:`Chameleon` :term:`ZPT` template. These templates will live in the .. ``templates`` directory of our tutorial package. 追加したビューはすべて :term:`template` を参照しています。 各テンプレートは :term:`Chameleon` :term:`ZPT` テンプレートです。これら のテンプレートは tutorial パッケージの ``templates`` ディレクトリの 中にあります。 .. The ``view.pt`` Template ``view.pt`` テンプレート ------------------------ .. The ``view.pt`` template is used for viewing a single wiki page. It .. is used by the ``view_page`` view function. It should have a ``div`` .. that is "structure replaced" with the ``content`` value provided by .. the view. It should also have a link on the rendered page that points .. at the "edit" URL (the URL which invokes the ``edit_page`` view for .. the page being viewed). ``view.pt`` テンプレートは単一の wiki ページを表示するために使用されています。 これは ``view_page`` ビュー関数によって使用されています。ビューによって 提供される ``content`` 値で "構造が置き換えられる" ``div`` を持っている必要 があります。また、レンダリングされたページに "edit" URL (表示されている ページに対して ``edit_page`` ビューを呼び出す URL) を指すリンクを持つ 必要もあります。 .. Once we're done with the ``view.pt`` template, it will look a lot like the .. below: ``view.pt`` テンプレートが完成すると、以下のようになります: .. literalinclude:: src/views/tutorial/templates/view.pt :language: xml .. .. note:: The names available for our use in a template are always .. those that are present in the dictionary returned by the view .. callable. But our templates make use of a ``request`` object that .. none of our tutorial views return in their dictionary. This value .. appears as if "by magic". However, ``request`` is one of several .. names that are available "by default" in a template when a template .. renderer is used. See :ref:`chameleon_template_renderers` for more .. information about other names that are available by default in a .. template when a Chameleon template is used as a renderer. .. note:: テンプレートで使用可能な名前は、常にビュー callable によって返された 辞書の中にあるものですが、これらのテンプレートではいずれのビューでも その辞書の中で返していない ``request`` オブジェクトを利用しています。 この値は "魔法のように" 現れます。しかし、 ``request`` はテンプレート レンダラが使用されているときにテンプレート内で "デフォルトで" 利用 可能ないくつかの名前のうちの1つです。レンダラとして Chameleon テンプレートを使用しているときにテンプレート内でデフォルトで利用可能 な他の名前についての詳細は :ref:`chameleon_template_renderers` を参照してください。 .. The ``edit.pt`` Template ``edit.pt`` テンプレート ------------------------ .. The ``edit.pt`` template is used for adding and editing a wiki page. It is .. used by the ``add_page`` and ``edit_page`` view functions. It should display .. a page containing a form that POSTs back to the "save_url" argument supplied .. by the view. The form should have a "body" textarea field (the page data), .. and a submit button that has the name "form.submitted". The textarea in the .. form should be filled with any existing page data when it is rendered. ``edit.pt`` テンプレートは wiki ページの追加と編集に使用されています。 これはビュー関数 ``add_page`` と ``edit_page`` から使用されています。 ``edit.pt`` はビューによって提供される "save_url" 引数にポストバック されるフォームを含むページを表示します。フォームには "body" textarea フィールド (ページのデータ) と "form.submitted" という名前の送信ボタン があります。フォームのテキストエリアは、レンダリングされたときに なんらかの存在するページのデータで埋められます。 .. Once we're done with the ``edit.pt`` template, it will look a lot like .. the following: ``edit.pt`` テンプレートが完成すると、以下のようになります: .. literalinclude:: src/views/tutorial/templates/edit.pt :language: xml .. Static Assets 静的アセット -------------- .. Our templates name a single static asset named ``pylons.css``. We don't need .. to create this file within our package's ``static`` directory because it was .. provided at the time we created the project. This file is a little too long .. to replicate within the body of this guide, however it is available `online .. `_. これらのテンプレートは ``pylons.css`` という名前の静的アセットを 参照しています。このファイルはプロジェクトを作成した時点で提供されているので、 パッケージの ``static`` ディレクトリ内にこのファイルを作成する必要は ありません。このファイルはこのガイドの本体内で置き換えるには少し長すぎますが、 `オンライン `_. で 利用可能です。 .. This CSS file will be accessed via .. e.g. ``http://localhost:6543/static/pylons.css`` by virtue of the call to .. ``add_static_view`` directive we've made in the ``__init__.py`` file. Any .. number and type of static assets can be placed in this directory (or .. subdirectories) and are just referred to by URL or by using the convenience .. method ``static_url`` .. e.g. ``request.static_url('{{package}}:static/foo.css')`` within templates. この CSS ファイルは ``__init__.py`` ファイルの中で行なった ``add_static_view`` の宣言の呼び出しのために、例えば ``http://localhost:6543/static/pylons.css`` を介してアクセスされます。 任意の数と種類の静的アセットはこのディレクトリ (またはサブディレクトリ) に配置することができ、 URL によって参照するか、便利なメソッド ``static_url`` を使用して参照します。例えばテンプレート内で ``request.static_url('{{package}}:static/foo.css')`` のように使用します。 .. Adding Routes to ``__init__.py`` ``__init__.py`` にルートを追加する ================================== .. The ``__init__.py`` file contains .. :meth:`pyramid.config.Configurator.add_route` calls which serve to add routes .. to our application. First, we’ll get rid of the existing route created by .. the template using the name ``'home'``. It’s only an example and isn’t .. relevant to our application. ``__init__.py`` ファイルにはアプリケーションにルートを追加するための :meth:`pyramid.config.Configurator.add_route` の呼び出しが含まれています。 最初に、テンプレート (訳注: scaffold) によって作成された ``'home'`` という 名前を使用している既存のルートを取り除きます。これは単なる例で、この アプリケーションには関係ありません。 .. We then need to add four calls to ``add_route``. Note that the *ordering* of .. these declarations is very important. ``route`` declarations are matched in .. the order they're found in the ``__init__.py`` file. その後、 ``add_route`` を4回呼び出す必要があります。なお、これらの宣言 の *順番* は非常に重要です。 ``ルート`` 宣言はそれらが ``__init__.py`` ファイルの中で見つかった順番でマッチされます。 .. #. Add a declaration which maps the pattern ``/`` (signifying the root URL) .. to the route named ``view_wiki``. It maps to our ``view_wiki`` view .. callable by virtue of the ``@view_config`` attached to the ``view_wiki`` .. view function indicating ``route_name='view_wiki'``. 1. ``/`` というパターン (ルート URL の意味) から ``view_wiki`` という名前の ルートにマッピングする宣言を追加します。それは ``view_wiki`` ビュー 関数に付けられた ``route_name='view_wiki'`` を示す ``@view_config`` に よって、ビュー callable ``view_wiki`` にマッピングします。 .. #. Add a declaration which maps the pattern ``/{pagename}`` to the route named .. ``view_page``. This is the regular view for a page. It maps .. to our ``view_page`` view callable by virtue of the ``@view_config`` .. attached to the ``view_page`` view function indicating .. ``route_name='view_page'``. 2. ``/{pagename}`` というパターンを ``view_page`` という名前のルートに マッピングする宣言を追加します。これはページに対する通常のビューです。 それは ``view_page`` ビュー関数に付けられた ``route_name='view_page'`` を示す ``@view_config`` によって、ビュー callable ``view_page`` にマッピングします。 .. #. Add a declaration which maps the pattern ``/add_page/{pagename}`` to the .. route named ``add_page``. This is the add view for a new page. It maps .. to our ``add_page`` view callable by virtue of the ``@view_config`` .. attached to the ``add_page`` view function indicating .. ``route_name='add_page'``. 3. ``/add_page/{pagename}`` というパターンを ``add_page`` という名前の ルートにマッピングする宣言を追加します。これは新しいページを追加する ためのビューです。それは ``add_page`` ビュー関数に付けられた ``route_name='add_page'`` を示す ``@view_config`` によって、ビュー callable ``add_page`` にマッピングします。 .. #. Add a declaration which maps the pattern ``/{pagename}/edit_page`` to the .. route named ``edit_page``. This is the edit view for a page. It maps .. to our ``edit_page`` view callable by virtue of the ``@view_config`` .. attached to the ``edit_page`` view function indicating .. ``route_name='edit_page'``. 4. ``/{pagename}/edit_page`` というパターンを ``edit_page`` という名前の ルートにマッピングする宣言を追加します。これはページの編集ビューです。 それは ``edit_page`` ビュー関数に付けられた ``route_name='edit_page'`` を示す ``@view_config`` によって、ビュー callable ``edit_page`` にマッピングします。 .. As a result of our edits, the ``__init__.py`` file should look .. something like: 編集の結果として ``__init__.py`` ファイルはこのようになるはずです: .. literalinclude:: src/views/tutorial/__init__.py :linenos: :language: python :emphasize-lines: 13-16 .. (The highlighted lines are the ones that need to be added or edited.) (ハイライトされた行は変更が必要な箇所です) .. Viewing the Application in a Browser ブラウザでアプリケーションを表示する ==================================== .. We can finally examine our application in a browser (See .. :ref:`wiki2-start-the-application`). The views we'll try are .. as follows: ようやくブラウザでアプリケーションを実行することができます (:ref:`wiki2-start-the-application` 参照) 。 これから試すビューは次の通りです: .. - Visiting ``http://localhost:6543`` in a browser invokes the .. ``view_wiki`` view. This always redirects to the ``view_page`` view .. of the FrontPage page object. - ブラウザで ``http://localhost:6543`` にアクセスすると ``view_wiki`` ビューが呼び出されます。このビューは常に FrontPage page オブジェクト の ``view_page`` ビューにリダイレクトします。 .. - Visiting ``http://localhost:6543/FrontPage`` in a browser invokes .. the ``view_page`` view of the front page page object. - ブラウザで ``http://localhost:6543/FrontPage`` にアクセスすると、 フロントページ page オブジェクトの ``view_page`` ビューが呼び出されます。 .. - Visiting ``http://localhost:6543/FrontPage/edit_page`` in a browser .. invokes the edit view for the front page object. - ブラウザで ``http://localhost:6543/FrontPage/edit_page`` にアクセス すると、フロントページ page オブジェクトの編集ビューが呼び出されます。 .. - Visiting ``http://localhost:6543/add_page/SomePageName`` in a .. browser invokes the add view for a page. - ブラウザで ``http://localhost:6543/add_page/SomePageName`` にアクセス すると、ページの追加ビューが呼び出されます。 .. Try generating an error within the body of a view by adding code to .. the top of it that generates an exception (e.g. ``raise .. Exception('Forced Exception')``). Then visit the error-raising view .. in a browser. You should see an interactive exception handler in the .. browser which allows you to examine values in a post-mortem mode. ビューの先頭に例外を生成するコードを追加して、ビューの本体内でエラーを 生成してみてください (例えば ``raise Exception('Forced Exception')``)。 次にブラウザでエラーを発生させるビューにアクセスします。ブラウザに インタラクティブ例外ハンドラが表示され、 post-mortem (検死) モードで 値を調べることができるはずです。