如何动态选择要在烧瓶中使用的模板目录?

anu*_*jkk 50 python jinja2 flask

默认情况下,flask使用存储在"template"目录中的模板文件:

/flaskapp
    /application.py
    /templates
        /hello.html
Run Code Online (Sandbox Code Playgroud)

有没有办法根据用户登录动态选择模板目录?这就是我想要的目录结构:

/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
Run Code Online (Sandbox Code Playgroud)

现在如果我有登录用户的用户名和用户激活的模板名称,是否可以动态选择加载模板文件的目录?例如,

/userdata/<username>/<activated template name>/
Run Code Online (Sandbox Code Playgroud)

而不是固定的

/templates/
Run Code Online (Sandbox Code Playgroud)

我想要实现的是像我的网络应用程序的主题系统的wordpress,用户可以上传/选择他的网站的主题.

nat*_*han 93

您可以将Flask构造函数传递给"template_folder"参数.

像这样......

Flask(__name__, template_folder="wherever")
Run Code Online (Sandbox Code Playgroud)

这是文档:http: //flask.pocoo.org/docs/api/


Ign*_*nas 40

还可以覆盖Jinja加载器并设置Jinja寻找模板的路径.喜欢:

my_loader = jinja2.ChoiceLoader([
        app.jinja_loader,
        jinja2.FileSystemLoader(['/flaskapp/userdata', 
                                 '/flaskapp/templates']),
    ])
app.jinja_loader = my_loader
Run Code Online (Sandbox Code Playgroud)

目录按照Jinja需要首先开始寻找的顺序排列.然后从视图中,您可以渲染用户特定的模板,如下所示:

render_template('%s/template1/hello.html' % username)
Run Code Online (Sandbox Code Playgroud)

用户名,您可以在视图中进行动态更改.当然,您也可以选择要渲染的模板(1或2).但基本上你真正想念的是这个定制的Jinja装载机带有自定义路径.

希望有所帮助或给出了想法:)

  • 您不必在列表或dicts声明中的Python中转义换行符. (6认同)