61

デフォルトでは、flaskは「template」ディレクトリに保存されているテンプレートファイルを使用します。

/flaskapp
    /application.py
    /templates
        /hello.html

ログインしているユーザーに応じてテンプレートディレクトリを動的に選択する方法はありますか?これが私がディレクトリ構造をどのようにしたいかです:

/flaskapp
    /application.py
    /templates (default template goes here)
        /hello.html
    /userdata
        /user1
            /template1
                 hello.html
            /template2
                 hello.html
        /user2
            /template1
                 hello.html
            /template2
                 hello.html

ログインしたユーザーのユーザー名とユーザーによってアクティブ化されたテンプレートの名前がある場合、テンプレートファイルをロードするディレクトリを動的に選択することはできますか?例えば、

/userdata/<username>/<activated template name>/

固定ではなく

/templates/

私が達成しようとしているのは、ユーザーが自分のWebサイトのテーマをアップロード/選択できるWebアプリケーション用のワードプレスのようなテーマシステムです。

4

3 に答える 3

110

Flaskコンストラクターに「template_folder」引数を渡すことができます。

そのようです...

Flask(__name__, template_folder="wherever")

ドキュメントは次のとおりです:http: //flask.pocoo.org/docs/api/

于 2012-11-28T05:46:33.853 に答える
48

Jinjaローダーを上書きして、Jinjaがテンプレートを探すパスを設定することもできます。好き:

my_loader = jinja2.ChoiceLoader([
        app.jinja_loader,
        jinja2.FileSystemLoader(['/flaskapp/userdata', 
                                 '/flaskapp/templates']),
    ])
app.jinja_loader = my_loader

ディレクトリは、Jinjaが最初に探し始める必要がある順序で配置されます。次に、ビューから次のようなユーザー固有のテンプレートをレンダリングできます。

render_template('%s/template1/hello.html' % username)

ここで、ユーザー名はビューで動的に変更できます。もちろん、レンダリングするテンプレート(1または2)を選択することもできます。しかし、基本的にあなたが本当に見逃しているのは、カスタムパスを備えたこのカスタムJinjaローダーです。

それがアイデアを助けたり与えたりしたことを願っています:)

于 2012-11-28T06:06:53.030 に答える
1

私はPythonを初めて使用しますが、すでにこの問題に直面しています。私の解決策が正しいかどうかはわかりませんが、機能します:

まず、ユーザーごとにモジュールを作成する必要があります

/flaskapp
    /application.py
    /templates (default template goes here)
        __init__.py     # default module flaskapp
        views.py        # here you can define methods for default module (like Action in MVC)
        /hello.html
    /static
    /userdata
        /user1
            __init__.py # user1 module
            views.py    # here you can define methods for user1 module
            /template1
                 hello.html
            /template2
                 hello.html
        /user2
            __init__.py # user2 module
            views.py    # here you can define methods for user2 module
            /template1
                 hello.html
            /template2
                 hello.html              

application.py init Flaskアプリで、グローバルメソッドrender_page_fromを追加し、ブループリントを登録します

app = Flask(__name__)
def render_page_from(controller_name, template_name_or_list, **context):
    # here you can choose any controller or use default
    app.jinja_loader.searchpath.clear()
    blueprint = app.blueprints[controller_name]
    app.jinja_loader.searchpath.append(blueprint.template_folder)
    return render_template(template_name_or_list, context=context)

from flaskapp.user1 import controller as user1_controller
from flaskapp.user2 import controller as user2_controller

app.register_blueprint(user1_controller)
app.register_blueprint(user2_controller)

各モジュール(user1、user2など)のinit.pyのinitブループリント

templates_folder = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'templates')

controller = Blueprint('user1', __name__, url_prefix='/user1', template_folder = templates_folder)

import flaskapp.user1.views

最後に、このようにviews.pyにview(アクション)メソッドを追加します

from LocalHub.client import controller
@controller.route('/hello')
def hello():
    """Renders the page"""
    return render_page_from(controller.name, 'hello.html', title='hello')
于 2016-10-25T20:15:32.950 に答える