1

mod_wsgi を介して Apache で Python 3.2 をセットアップしました。シンプルな「Hello World」Webページを提供するCherryPy 3.2があります。サイトを構築する際に、Jinja2 を使用してテンプレートを作成したいと考えています。私は Python を初めて使用するので、Python、CherryPy、または Jinja についてあまり知りません。

以下のコードを使用して、サイト ルート ( /) と製品ページ ( /products) を基本的なテキストと共に読み込むことができます。これで少なくとも、Python、mod_wsgi、および CherryPy がある程度適切にセットアップされていることがわかります。

サイトには多くのページがあるため、各ページ ハンドラー クラスでテンプレートを宣言してレンダリングする必要がないように、Jinja テンプレートを実装したいと考えています。私が知る限り、これを行う最善の方法は、次の例のように PageHandler をラップすることです。

2 番目の例のコードを実装しましたが、何も変わりません。

[コード後の詳細]

wsgi_handler.py -いくつかのチュートリアルとサンプルのマッシュアップ

import sys, os
abspath = os.path.dirname(__file__)
sys.path.append(abspath)
sys.path.append(abspath + '/libs')
sys.path.append(abspath + '/app')
sys.stdout = sys.stderr

import atexit
import threading
import cherrypy
from cherrypy._cptools import HandlerWrapperTool
from libs.jinja2 import Environment, PackageLoader

# Import from custom module
from core import Page, Products

cherrypy.config.update({'environment': 'embedded'})

env = Environment(loader=PackageLoader('app', 'templates'))

# This should wrap the PageHandler
def interpolator(next_handler, *args, **kwargs):
    template = env.get_template('base.html')
    response_dict = next_handler(*args, **kwargs)
    return template.render(**response_dict)

# Put the wrapper in place(?)
cherrypy.tools.jinja = HandlerWrapperTool(interpolator)

# Configure site routing
root = Page()
root.products = Products()

# Load the application
application = cherrypy.Application(root, '', abspath + '/app/config')

/アプリ/構成

[/]
request.dispatch: cherrypy.dispatch.MethodDispatcher()

コア モジュール クラス

class Page:
    exposed = True

    def GET(self):
        return "got Page"

    def POST(self, name, password):
        return "created"

class Products:
    exposed = True

    def GET(self):
        return "got Products"

    def POST(self, name, password):
        return "created"

Google グループで読んだ内容に基づいて、Jinja ツールを「有効にする」必要があるかもしれないと考えたので、構成を次のように更新しました。

/アプリ/構成

[/]
tools.jinja.on = True
request.dispatch: cherrypy.dispatch.MethodDispatcher()

構成を更新した後、サイトのルート ページと製品ページに、CherryPy によって生成されたエラー ページ「500 内部サーバー エラー」が表示されます。詳細なエラー メッセージはログに見つかりません (少なくとも、私が認識しているログにはありません)。

プレインストールされていない限り、そこにあるJinja ツールが必要になることはわかっていますが、どこに配置すればよいか、有効にする方法がわかりません。それ、どうやったら出来るの?

私はこれを正しい方法で行っていますか、それとももっと良い方法がありますか?

編集(2012 年 5 月 21 日):

私が使用しているJinja2テンプレートは次のとおりです。

<!DOCTYPE html>
<html>
    <head>
        <title>{{ title }}</title>
    </head>
    <body>
        <h1>Hello World</h1>
    </body>
</html>
4

2 に答える 2

1

私はそれを考え出した。

interpolator関数では、関数next_handlerは元の PageHandler (Page.GETまたはProducts.GETこの場合) を呼び出します。これらの元の PageHandlers は、interpolator関数が python dict (辞書) のように応答を処理しているtemplate.render間、文字列を返します**response_dict

Jinja テンプレートには のプレースホルダーがあるためtitle、タイトルを定義する必要があります。単純な文字列をレンダリング関数に渡すと、タイトルがどうあるべきかが定義されません。render 関数に実際の dict を渡す必要があります (または何も渡さなくても構いませんが、それは何の役に立つのでしょうか?)。

tools.jinja.on注: これらの修正のいずれについても、質問に示されているように、構成で True に設定して jinja ツールを有効にする必要があります。

クイックフィックス

render 関数が呼び出されるときにタイトルを定義します。これを行うには、次の行を変更する必要があります。

return template.render(**response_dict) # passing the string as dict - bad

これに:

return template.render(title=response_dict) # pass as string and assign to title

このように、テンプレートは PageHandler テキストをページ タイトルとしてレンダリングします。

より良い修正

テンプレートはより複雑になるため、1 つのレンダリング関数で必要なプレースホルダーを常に正しく割り当てることができるとは限りません。元のページ ハンドラーが、テンプレートの多くのプレースホルダーが割り当てられた実際の辞書を返すようにすることは、おそらく良い考えです。

補間関数はそのままにしておきます。

def interpolator(next_handler, *args, **kwargs):
    template = env.get_template('base.html')
    response_dict = next_handler(*args, **kwargs)
    return template.render(**response_dict)

Page と Products を更新して、テンプレートのプレースホルダーの値を定義する実際の辞書を返します。

class Page:
    exposed = True

    def GET(self):
        dict = {'title' : "got Page"}
        return dict

    def POST(self, name, password):
        # This should be updated too
        # I just haven't used it yet
        return "created"

class Products:
    exposed = True

    def GET(self):
        dict = {'title' : "got Products"}
        return dict

    def POST(self, name, password):
        # This should be updated too
        # I just haven't used it yet
        return "created"

このように、テンプレートは PageHandler タイトル テキストをページ タイトルとしてレンダリングします。

于 2012-05-21T17:17:16.173 に答える
1

また、コミュニティが貢献したさまざまなレシピのリポジトリにある、更新されたJinja2ツールもあります。

于 2012-05-22T19:50:55.887 に答える