0

Web で見つけたチュートリアルに基づいて、Flask を使用してアプリケーションをセットアップしています。私が抱えている問題は、これまでのところ、作成したいビュー/ルートごとに多くのコードを作成する必要があるように思われるため、より良いシステムを考案しようとしていますが、各ステップを実際にテストする前にコードを書きすぎました。フレームワークに慣れていないため、迷ってしまいました。

だから私が欲しいのは、いくつかの定型的なものを抽出するベースビュークラスです。これが私のこれまでの試みです。

import jinja2
from jinja2 import Environment as Jinja2Environment
from webassets import Environment as AssetsEnvironment
from webassets.loaders import YAMLLoader
from webassets.ext.jinja2 import AssetsExtension
from flask import render_template
from app import app

class BaseView(object):

    def __init__(self):
        "init"

    def get_jinja_env(self):
        jinja_env = Jinja2Environment(loader=jinja2.FileSystemLoader('templates/'), extensions=[AssetsExtension])

        return jinja_env

    def get_asset_env(self):
        asset_loader = webassets.YAMLLoader('conf/assets.yml')
        asset_env = asset_loader.load_environment()
        bundles = asset_loader.load_bundles()
        [asset_env.register(name, bundle) for name, bundle in bundles.iteritems()]

        return asset_env

    def render_tmpl(self, tmpl_file, **context):
        "Renders Jinja Template"
        jinja_env = self.get_jinja_env
        jinja_env.assets_environment = self.get_asset_env

        template = jinja_env.get_template(tmpl_file)
        return template.render(context)

BaseView から継承しようとするクラス

from app.BaseView import BaseView
from app import app

class HelloView(BaseView):

    @app.route('/')
    def respond(self):
        self.render_tmpl('hello.html')

これの背後にある理由は、後でキャッシュなどの Jinja 機能を拡張し、すべてのビューとテンプレートでいくつかのデータを利用できるようにすることです。

4

2 に答える 2

1

フラスコに既に含まれているView クラスを使用する必要があります。

それらは非常によく説明されているので、ここで説明できることはあまりありません。ドキュメントを読むだけで、何をしなければならないかがわかると思います(フラスコのドキュメントは素晴らしいです。)

キャッシュしたい場合は、Flask-Cacheも参照してください。

于 2012-11-27T13:50:55.280 に答える
0

これはあなたの質問に完全に答えるものではありませんが、とにかく言及する価値があると思いました.

変数を Jinja 環境のグローバルに「エクスポート」できます。

app.jinja_env.globals['data'] = ['One', 'Two', 'Three']

これが完了すると、すべてのテンプレートがdata変数にアクセスできるようになり、 経由で渡されたかのように操作できますkargs。わざわざまったく新しいビュー クラスを作成する必要はありません。一度処理するだけで、どこでも利用できるようになります。サイドバーやログインステータスなどに便利です。

于 2012-11-19T09:21:14.540 に答える