デフォルトでは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/
私が達成しようとしているのは、wordpress===================================================================================.
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ローダーです。
アイデアを助けたり与えたりしたことを願っています:)
Flaskコンストラクタに "template_folder"引数を渡すことができます。
そのようです...
Flask(__name__, template_folder="wherever")
ドキュメントは次のとおりです。 http://flask.pocoo.org/docs/api/
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 appで、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に追加します
from LocalHub.client import controller
@controller.route('/hello')
def hello():
"""Renders the page"""
return render_page_from(controller.name, 'hello.html', title='hello')