(機械翻訳)ビューの定義

A:term: view callable:term:` traversal`-based:app: Pyramid`アプリケーションは通常、term: context`と:term: `request`という2つのパラメータを受け入れる単純なPython関数です。ビューcallableは:term: `response`オブジェクトを返すものとします。

注釈

A:app: Pyramid`ビューは* only * a:term: request`引数を受け入れる呼び出し可能関数として定義することもできます。他の:app: Pyramid`チュートリアルやアプリケーションで使用されているこの1つの引数のパターンが表示されます。いずれかの呼び出し規約は、app: `Pyramid`アプリケーションで動作します。呼び出し規約は必要に応じて互換的に使用できます。 in:term: `traversal`ベースのアプリケーションでは、URLはcontext:term: resource`にマップされ、term: resource tree`もアプリケーションの"ドメインモデル"を表します。これは、アプリケーションの永続的なストレージを表すためです。このため、このチュートリアルでは、ビューを呼び出し可能引数リストに ` context``を受け入れる呼び出し可能関数として定義します。要求を単一の引数として取るビュー関数内で `` context``が必要な場合は、 `` request.context` "で取得できます。

term: view callable`関数をいくつか定義し、次に:term: view configuration`を使って:app: `Pyramid`に配線します。

`` setup.py``ファイルの依存関係の宣言

アプリケーションのビューコードは、オリジナルの "チュートリアル"アプリケーションの依存関係ではないパッケージに依存します。オリジナルの "チュートリアル"アプリケーションは、cookiecutterによって生成されました。カスタムアプリケーションの要件についてはわかりません。

`` docutils``パッケージの依存関係を ``チュートリアル ``パッケージの `` setup.py``ファイルに追加する必要があります。この依存関係は `` setup() ``の `` requires``パラメータに割り当てます。 `関数。

`` setup.py``を開き、以下のように編集してください:

 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import os

from setuptools import setup, find_packages

here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.txt')) as f:
    README = f.read()
with open(os.path.join(here, 'CHANGES.txt')) as f:
    CHANGES = f.read()

requires = [
    'plaster_pastedeploy',
    'pyramid >= 1.9a',
    'pyramid_chameleon',
    'pyramid_debugtoolbar',
    'pyramid_retry',
    'pyramid_tm',
    'pyramid_zodbconn',
    'transaction',
    'ZODB3',
    'waitress',
    'docutils',
]

tests_require = [
    'WebTest >= 1.3.1',  # py3 compat
    'pytest',
    'pytest-cov',
]

setup(
    name='tutorial',
    version='0.0',
    description='myproj',
    long_description=README + '\n\n' + CHANGES,
    classifiers=[
        'Programming Language :: Python',
        'Framework :: Pyramid',
        'Topic :: Internet :: WWW/HTTP',
        'Topic :: Internet :: WWW/HTTP :: WSGI :: Application',
    ],
    author='',
    author_email='',
    url='',
    keywords='web pyramid pylons',
    packages=find_packages(),
    include_package_data=True,
    zip_safe=False,
    extras_require={
        'testing': tests_require,
    },
    install_requires=requires,
    entry_points={
        'paste.app_factory': [
            'main = tutorial:main',
        ],
    },
)

強調表示された行だけを追加する必要があります。

`` pip install -e .``を実行しています。

新しいソフトウェア依存関係が追加されたので、 `` tutorial``パッケージのルートの中で `` pip install -e .``を再度実行して、新たに追加された依存関係を取得して登録する必要があります。

現在の作業ディレクトリがプロジェクトのルート( `` setup.py``が存在するディレクトリ)であることを確認し、次のコマンドを実行してください。

UNIXの場合:

$ cd tutorial
$ $VENV/bin/pip install -e .

Windowsの場合:

c:\> cd tutorial
c:\tutorial> %VENV%\Scripts\pip install -e .

このコマンドを実行すると、次のような行がコンソールに表示されます。

Successfully installed docutils-0.13.1 tutorial

`` views.py``にビュー関数を追加する

大きな変化の時です。 `` tutorial / views.py``を開き、以下のように編集してください:

 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from docutils.core import publish_parts
import re

from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config

from .models import Page

# regular expression used to find WikiWords
wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)")

@view_config(context='.models.Wiki')
def view_wiki(context, request):
    return HTTPFound(location=request.resource_url(context, 'FrontPage'))

@view_config(context='.models.Page', renderer='templates/view.pt')
def view_page(context, request):
    wiki = context.__parent__

    def check(match):
        word = match.group(1)
        if word in wiki:
            page = wiki[word]
            view_url = request.resource_url(page)
            return '<a href="%s">%s</a>' % (view_url, word)
        else:
            add_url = request.application_url + '/add_page/' + word
            return '<a href="%s">%s</a>' % (add_url, word)

    content = publish_parts(context.data, writer_name='html')['html_body']
    content = wikiwords.sub(check, content)
    edit_url = request.resource_url(context, 'edit_page')
    return dict(page=context, content=content, edit_url=edit_url)

@view_config(name='add_page', context='.models.Wiki',
             renderer='templates/edit.pt')
def add_page(context, request):
    pagename = request.subpath[0]
    if 'form.submitted' in request.params:
        body = request.params['body']
        page = Page(body)
        page.__name__ = pagename
        page.__parent__ = context
        context[pagename] = page
        return HTTPFound(location=request.resource_url(page))
    save_url = request.resource_url(context, 'add_page', pagename)
    page = Page('')
    page.__name__ = pagename
    page.__parent__ = context
    return dict(page=page, save_url=save_url)

@view_config(name='edit_page', context='.models.Page',
             renderer='templates/edit.pt')
def edit_page(context, request):
    if 'form.submitted' in request.params:
        context.data = request.params['body']
        return HTTPFound(location=request.resource_url(context))

    return dict(page=context,
                save_url=request.resource_url(context, 'edit_page'))

いくつかのインポートを追加し、&quot;WikiWords &quot;を見つける正規表現を作成しました。

もともと `` zodb`` cookiecutterをレンダリングしたときに追加された `` my_view``ビュー関数とそのデコレータを取り除きました。これは単なる例であり、私たちのアプリケーションには関係ありません。

次に、term: view callable`関数を `views.py``モジュールに追加しました:

  • `` view_wiki() `` - wiki自体を表示します。それはルートURLで答えるでしょう。
  • `` view_page() `` - 個々のページを表示します。
  • `` add_page() `` - ユーザーがページを追加できるようにします。
  • `` edit_page() `` - ユーザがページを編集できるようにします。

以下のセクションでは、それぞれを簡単に説明します。

注釈

ファイル名 `` views.py``には何も特別なものはありません。プロジェクトは、コードベース全体で、任意の名前のファイルで多くのビュー呼び出し可能ファイルを持つことができます。ビュー呼び出し可能ファイルを実装しているファイルは、ファイル名に `` view``を持つことが多い(または `` views``という名前のアプリケーションパッケージのPythonサブパッケージにあるかもしれませんが)、これは慣例によるものです。

`` view_wiki``ビュー関数

以下は `` view_wiki``ビュー関数とそのデコレータのコードです:

12
13
14
@view_config(context='.models.Wiki')
def view_wiki(context, request):
    return HTTPFound(location=request.resource_url(context, 'FrontPage'))

注釈

私たちのコードでは、 `` tutorial``という名前のパッケージに* relative という import *を使用しています。つまり、 `` import``と `` context``の中でパッケージの名前を省略することができます。しかし、私たちの物語では、クラス*を参照するので、パッケージの名前が含まれていることを意味する*絶対*形式を使用します。

`` view_wiki() ``は、wikiのルートURLへのリクエストがあったときに呼び出される:term: `default view`です。常に&quot;FrontPage &quot;へのパスを表すURLにリダイレクトされます。

私たちは `` @ view_config``デコレータを提供します。このデコレータは、そのコンテキストとして `` tutorial.models.Wiki``というクラスを命名します。つまり、Wikiリソースがコンテキストであり、要求にno:term: view name`が存在する場合、このビューが使用されます。 ` view_wiki``に関連したビュー設定は、 `` renderer``を使用しません。なぜなら、callableビューは常に辞書ではなく:term: `response`オブジェクトを返すからです。ビューが応答オブジェクトを返すとき、レンダラーは必要ありません。

`` view_wiki``ビューcallableは、常に&quot;FrontPage &quot;という名前のページリソースのURLにリダイレクトします。これを行うには、:class: pyramid.httpexceptions.HTTPFound`クラスのインスタンスを返します(インスタンスは:class: pyramid.interfaces.IResponse`インターフェイスを実装しています:class: pyramid.response.Response`そうです)。 :meth: `pyramid.request.Request.route_url APIを使用して` FrontPage``ページリソース( http:// localhost:6543 / FrontPage`)へのURLを構築し、それを使用します`` HTTPFound``レスポンスの&quot;location &quot;として、HTTPリダイレクトを形成します。

`` view_page``ビュー関数

`` view_page``ビュー関数とそのデコレータのコードを以下に示します:

16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@view_config(context='.models.Page', renderer='templates/view.pt')
def view_page(context, request):
    wiki = context.__parent__

    def check(match):
        word = match.group(1)
        if word in wiki:
            page = wiki[word]
            view_url = request.resource_url(page)
            return '<a href="%s">%s</a>' % (view_url, word)
        else:
            add_url = request.application_url + '/add_page/' + word
            return '<a href="%s">%s</a>' % (add_url, word)

    content = publish_parts(context.data, writer_name='html')['html_body']
    content = wikiwords.sub(check, content)
    edit_url = request.resource_url(context, 'edit_page')
    return dict(page=context, content=content, edit_url=edit_url)

`` view_page``関数は、Pageリソースのデフォルトビューとして応答するように設定されています。私たちは `` @ view_config``デコレータを提供します。このデコレータは、そのコンテキストとして `` tutorial.models.Page``というクラスを名付けます。これは、Pageリソースがコンテキストで、リクエストに term: view name`が存在しない場合、このビューが使用されることを意味します。 app: Pyramid`このビューは `templates / view.pt``テンプレートファイルをレンダラーとして使用します。

`` view_page``関数はページの:term: reStructuredText`ボディを生成します(ビューに渡されるコンテキストの data``属性として保存されます;コンテキストは `Page``リソースです)。 HTML。次に、コンパイルされた正規表現を使用して、レンダリングされたHTMLの* WikiWord *参照ごとにHTMLアンカーを置き換えます。

`` check``と呼ばれるカリー化された関数は、 `` wikiwords.sub``の最初の引数として使われ、コンテンツ内で見つかる各WikiWordの一致の値を提供するために呼び出されるべきであることを示します。 wiki(私たちのページの `` __parent__``)にWikiWordの名前が一致するページがすでに含まれている場合、 `` check``関数は置換値として使用されるビューリンクを生成して返します。 wikiに一致するWikiWord名のページがまだ含まれていない場合、関数は置換値として&quot;add &quot;リンクを生成して返します。

その結果、 `` content``変数は、現在のページリソースの内容に基づいて、さまざまなビューを含むHTMLの完全に形成されたビットであり、WikiWordsのリンクを追加します。

テンプレートよりもここでやる方が簡単であるため、編集URLを生成し、辞書にいくつかの引数をまとめて返します。

辞書にラップする引数には、 `` page``、 `` content``、 `` edit_url``などがあります。その結果、このビューを呼び出し可能にする*テンプレート*は、それらの名前を使ってさまざまなレンダリングタスクを実行することができます。このビュー呼び出し可能に関連付けられたテンプレートは `` templates / view.pt``にあるテンプレートになります。

このビューの呼び出し可能と、 `` view_wiki``ビューの呼び出し可能との対比に注意してください。 `` view_wiki``ビューのcallableでは、無条件にa:term: response`オブジェクトを返します。 ` view_page``ビューのcallableでは、* dictionary *を返します。 :app: Pyramid`ビューから:term: response`オブジェクトを返すことは常に*素晴らしい*です。ビューの設定で呼び出し可能なビューに関連付けられた:term: `renderer`がある場合にのみ、辞書を返すことができます。

`` add_page``ビュー関数

`` add_page``ビュー関数とそのデコレータのコードを以下に示します:

35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@view_config(name='add_page', context='.models.Wiki',
             renderer='templates/edit.pt')
def add_page(context, request):
    pagename = request.subpath[0]
    if 'form.submitted' in request.params:
        body = request.params['body']
        page = Page(body)
        page.__name__ = pagename
        page.__parent__ = context
        context[pagename] = page
        return HTTPFound(location=request.resource_url(page))
    save_url = request.resource_url(context, 'add_page', pagename)
    page = Page('')
    page.__name__ = pagename
    page.__parent__ = context
    return dict(page=page, save_url=save_url)

`` add_page``関数は、コンテキストリソースがWikiであり、:term: view name`が add_page``であるときに応答するように設定されています。私たちは ` @ view_config``デコレータを提供します。このデコレータは、文字列 `` add_page``をterm: view name`( name = を介して)、クラス tutorial.models.Wiki をコンテキストとして使用し、レンダラを templates / edit.pt``と呼びます。つまり、Wikiリソースがコンテキストであり、トラバーサルの結果として ` add_page``という名前のa:term: view name`が存在する場合、このビューが使用されます。 app: `Pyramid`このビューは、 templates / edit.pt``テンプレートファイルを renderer``として使用します。私たちは、追加ビューと編集ビューの間で同じテンプレートを共有します。つまり、 ` add.pt``ではなく `` edit.pt``です。

`` add_page``関数は、ユーザがまだシステム内のページとして表現されていないWikiWordをクリックしたときに呼び出されます。 `` view_page``ビュー内の `` check``関数は、このビューへのURLを生成します。また、ページリソースを追加するときに生成されるフォームのハンドラとしても機能します。 `` add_page``ビューの `` context``は常にWikiリソースです(ページリソースではありません)。

app: Pyramid`の中のrequest:term: subpath`は、WSGIリクエストの `` PATH_INFO``で与えられたURLセグメントの*:view name`の後に* term: `traversal`の結果です。 addビューが、例えば ` http:// localhost:6543 / add_page / SomeName``を介して呼び出された場合、:term: subpath`は ( &#39;SomeName&#39;、) `のタプルになります。

addビューは、サブパス(wikiページ名)のゼロ:sup: `th`要素をとり、追加しようとしているページの名前を知るためにname属性にエイリアスします。

ビューのレンダリングがフォーム提出の結果でない*( `` form.modified &#39;が `` False``である場合)、ビューはテンプレートをレンダリングします。これを行うために、テンプレートはレンダリング時にフォームの投稿URLとして使用する&quot;保存URL &quot;を生成します。ここでは怠惰なので、追加ビューとページ編集ビューに同じテンプレート( `` templates / edit.pt``)を使用しようとしています。これを行うために、* pageオブジェクトを* `` page``として公開する編集フォームの要求を満たすためにダミーのPage resourceオブジェクトを作成し、そのテンプレートをレスポンスにレンダリングします。

ビューレンダリング*がフォーム提出の結果である場合(フォーム `` &#39;request.params``の中のform.submittedが `` True``の場合)、フォームデータからページ本文を取得し、ページオブジェクトは、サブパスの名前とページ本文を使用し、コンテキストの `` __setitem__``メソッドを使用して&quot;our context &quot;(Wiki)に保存します。新しく作成したページの `` view_page``ビュー(ページのデフォルトビュー)にリダイレクトします。

`` edit_page``ビュー関数

`` edit_page``ビュー関数とそのデコレータのコードは次のとおりです:

52
53
54
55
56
57
58
59
60
@view_config(name='edit_page', context='.models.Page',
             renderer='templates/edit.pt')
def edit_page(context, request):
    if 'form.submitted' in request.params:
        context.data = request.params['body']
        return HTTPFound(location=request.resource_url(context))

    return dict(page=context,
                save_url=request.resource_url(context, 'edit_page'))

`` edit_page``関数は、コンテキストがページリソースであり、:term: view name`が edit_page``であるときに応答するように設定されています。 term: `view name`( name = を介して)、 tutorial.models.Page``クラスの文字列 edit_page``を @ view_config``デコレータで提供します。 `をコンテキストとして使用し、レンダラを templates / edit.pt``と呼びます。つまり、Pageリソースがコンテキストで、 ` edit_page``という名前のトラバーサルの結果として:term: view name`が存在する場合、このビューが使用されます。 app: `Pyramid`このビューは、 templates / edit.pt``テンプレートファイルを `renderer``として使用します。

`` edit_page``関数は、ユーザがビューフォームの&quot;Edit this Page &quot;ボタンをクリックすると呼び出されます。これは編集フォームをレンダリングしますが、レンダリングするフォームで呼び出すことのできるフォームポストビューとしても機能します。 `` edit_page``ビューの `` context``は常に*ページリソース(決してWikiリソースではありません)になります。

ビューの実行がフォームのサブミットの結果でない場合(ビュー `` &#39;form`mitted&#39; in request.params``が `` False``の場合)、ビューは単純にフォームをレンダリングし、ページを渡しますリソースと、生成されたフォームのアクションとして使用される `` save_url``があります。

ビューの実行*がフォーム提出の結果である場合(ビュー `` &#39;request.params``の中のform.submittedが `` True``の場合)、ビューは `` body``要素を取得します。 requestパラメータを設定し、それをページコンテキストの `` data``属性として設定します。次に、コンテキストのデフォルトビュー(ページ)にリダイレクトします。このビューは常に `` view_page``ビューになります。

テンプレートの追加

`` view_page``、 `` add_page``、 `` edit_page``ビューは、参照:a:term: template`を追加しました。各テンプレートは:term: `Chameleon:term:` ZPT`テンプレートです。これらのテンプレートはチュートリアルパッケージの `` templates``ディレクトリにあります。カメレオンのテンプレートは、そのように認識されるには `` .pt``拡張子を持たなければなりません。

`` view.pt``テンプレート

tutorial / templates / mytemplate.pt``の名前を `tutorial / templates / view.pt``に変更し、強調された行を以下のように編集します:

 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<!DOCTYPE html>
<html lang="${request.locale_name}">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="pyramid web application">
    <meta name="author" content="Pylons Project">
    <link rel="shortcut icon" href="${request.static_url('tutorial:static/pyramid-16x16.png')}">

    <title>${page.__name__} - Pyramid tutorial wiki (based on
    TurboGears 20-Minute Wiki)</title>

    <!-- Bootstrap core CSS -->
    <link href="//oss.maxcdn.com/libs/twitter-bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this scaffold -->
    <link href="${request.static_url('tutorial:static/theme.css')}" rel="stylesheet">

    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="//oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js" integrity="sha384-0s5Pv64cNZJieYFkXYOTId2HMA2Lfb6q2nAcx2n0RTLUnCAoTTsS0nKEO27XyKcY" crossorigin="anonymous"></script>
      <script src="//oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js" integrity="sha384-f1r2UzjsxZ9T4V1f2zBO/evUqSEOpeaUUZcMTz1Up63bl4ruYnFYeM+BxI4NhyI0" crossorigin="anonymous"></script>
    <![endif]-->
  </head>

  <body>

    <div class="starter-template">
      <div class="container">
        <div class="row">
          <div class="col-md-2">
            <img class="logo img-responsive" src="${request.static_url('tutorial:static/pyramid.png')}" alt="pyramid web framework">
          </div>
          <div class="col-md-10">
            <div class="content">
              <div tal:replace="structure content">
                Page text goes here.
              </div>
              <p>
                <a tal:attributes="href edit_url" href="">
                  Edit this page
                </a>
              </p>
              <p>
                  Viewing <strong><span tal:replace="page.__name__">
                  Page Name Goes Here</span></strong>
              </p>
              <p>You can return to the
                <a href="${request.application_url}">FrontPage</a>.
              </p>
            </div>
          </div>
        </div>
        <div class="row">
          <div class="copyright">
            Copyright &copy; Pylons Project
          </div>
        </div>
      </div>
    </div>


    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="//oss.maxcdn.com/libs/jquery/1.10.2/jquery.min.js" integrity="sha384-aBL3Lzi6c9LNDGvpHkZrrm3ZVsIwohDD7CDozL0pk8FwCrfmV7H9w8j3L7ikEv6h" crossorigin="anonymous"></script>
    <script src="//oss.maxcdn.com/libs/twitter-bootstrap/3.0.3/js/bootstrap.min.js" integrity="sha384-s1ITto93iSMDxlp/79qhWHi+LsIi9Gx6yL+cOKDuymvihkfol83TYbLbOw+W/wv4" crossorigin="anonymous"></script>
  </body>
</html>

このテンプレートは、単一のwikiページを表示するために `` view_page() ``によって使用されます。それは以下を含む:

  • ビューによって提供される `` content``値で置き換えられる `` div``要素です(行37-39)。 `` content``はHTMLを含んでいるので、 `` structure``キーワードはそれをエスケープするのを防ぐために使われます(&quot;&gt; &quot;を&quot;&gt; &quot;などに変更する)
  • 表示されているページの `` edit_page``ビューを呼び出す&quot;編集&quot; URLを指すリンク(41-43行目)。

`` edit.pt``テンプレート

`` tutorial / templates / view.pt``を `` tutorial / templates / edit.pt``にコピーし、強調表示された行を以下のように編集します:

 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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<!DOCTYPE html>
<html lang="${request.locale_name}">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="description" content="pyramid web application">
    <meta name="author" content="Pylons Project">
    <link rel="shortcut icon" href="${request.static_url('tutorial:static/pyramid-16x16.png')}">

    <title>${page.__name__} - Pyramid tutorial wiki (based on
    TurboGears 20-Minute Wiki)</title>

    <!-- Bootstrap core CSS -->
    <link href="//oss.maxcdn.com/libs/twitter-bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom styles for this scaffold -->
    <link href="${request.static_url('tutorial:static/theme.css')}" rel="stylesheet">

    <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
      <script src="//oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js" integrity="sha384-0s5Pv64cNZJieYFkXYOTId2HMA2Lfb6q2nAcx2n0RTLUnCAoTTsS0nKEO27XyKcY" crossorigin="anonymous"></script>
      <script src="//oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js" integrity="sha384-f1r2UzjsxZ9T4V1f2zBO/evUqSEOpeaUUZcMTz1Up63bl4ruYnFYeM+BxI4NhyI0" crossorigin="anonymous"></script>
    <![endif]-->
  </head>
  <body>

    <div class="starter-template">
      <div class="container">
        <div class="row">
          <div class="col-md-2">
            <img class="logo img-responsive" src="${request.static_url('tutorial:static/pyramid.png')}" alt="pyramid web framework">
          </div>
          <div class="col-md-10">
            <div class="content">
              <p>
                  Editing <strong><span tal:replace="page.__name__">
                  Page Name Goes Here</span></strong>
              </p>
              <p>You can return to the
                <a href="${request.application_url}">FrontPage</a>.
              </p>
              <form action="${save_url}" method="post">
                <div class="form-group">
                  <textarea class="form-control" name="body" tal:content="page.data" rows="10" cols="60"></textarea>
                </div>
                <div class="form-group">
                  <button type="submit" name="form.submitted" value="Save" class="btn btn-default">Save</button>
                </div>
              </form>
            </div>
          </div>
        </div>
        <div class="row">
          <div class="copyright">
            Copyright &copy; Pylons Project
          </div>
        </div>
      </div>
    </div>


    <!-- Bootstrap core JavaScript
    ================================================== -->
    <!-- Placed at the end of the document so the pages load faster -->
    <script src="//oss.maxcdn.com/libs/jquery/1.10.2/jquery.min.js" integrity="sha384-aBL3Lzi6c9LNDGvpHkZrrm3ZVsIwohDD7CDozL0pk8FwCrfmV7H9w8j3L7ikEv6h" crossorigin="anonymous"></script>
    <script src="//oss.maxcdn.com/libs/twitter-bootstrap/3.0.3/js/bootstrap.min.js" integrity="sha384-s1ITto93iSMDxlp/79qhWHi+LsIi9Gx6yL+cOKDuymvihkfol83TYbLbOw+W/wv4" crossorigin="anonymous"></script>
  </body>
</html>

このテンプレートは、 `` add_page() ``と `` edit_page() ``によってwikiページの追加と編集に使用されます。以下を含むフォームを含むページが表示されます。

  • 既存のページデータがレンダリングされると(行46)、すべてのページデータで満たされる、 body &#39;という名前の10行×60列の textarea`フィールド。
  • 「form.submitted」という名前の送信ボタン(49行目)。

フォームは、ビューが提供する `` save_url``引数に戻ります(行44)。ビューは `` body``と `` form.submitted``の値を使用します。

注釈

私たちのテンプレートは、私たちのチュートリアルビューのどれもが辞書に返されない `` request``オブジェクトを使います。 `` request``は、テンプレートレンダラーが使用されているときに、テンプレート内でデフォルトで利用可能ないくつかの名前の1つです。テンプレートがレンダラーとして使われるときにデフォルトで利用可能な他の名前については、ref: `renderer_system_values`を参照してください。

静的資産

テンプレートには、CSSや画像などの静的資産の名前が付けられます。これらのファイルは、プロジェクトの作成時に提供されたものであるため、パッケージの `` static``ディレクトリ内に作成する必要はありません。

例として、CSSファイルは、 `` __init__で作った `` add_static_view``ディレクティブを呼び出すことによって、 `` http:// localhost:6543 / static / theme.css``を介してアクセスされます.py``ファイル。任意の数とタイプの静的アセットをこのディレクトリ(またはサブディレクトリ)に配置することができ、単にURLで、または `` static_url``という便利なメソッドを使用するだけです。たとえば、 `` request.static_url( &#39; <package> :static / foo.css &#39;) ``テンプレート内にあります。

ブラウザでのアプリケーションの表示

最後に、ブラウザでアプリケーションを調べることができます(参照:ref: wiki-start-the-application)。ブラウザを起動し、次の各URLにアクセスして、結果が期待どおりであることを確認します。

  • http:// localhost:6543 / `` view_wiki``ビューを呼び出します。これは常に `` FrontPage``ページリソースの `` view_page``ビューにリダイレクトされます。
  • http:// localhost:6543 / FrontPage /は、フロントページリソースの `` view_page``ビューを呼び出します。これは、ページリソースの:term: default view`( `name``のないビュー)です。
  • http:// localhost:6543 / FrontPage / edit_pageは、 `` FrontPage``ページリソースの編集ビューを呼び出します。
  • http:// localhost:6543 / add_page / SomePageNameは、ページの追加ビューを呼び出します。
  • エラーを生成するには、http:// localhost:6543 / add_pageを参照してください。これは、 `` IndexError:tuple index to range``エラーを生成します。対話的なトレースバック機能がterm: `pyramid_debugtoolbar`によって提供されます。