Search code examples
pythonflaskjinja2

How to dynamically select template directory to be used in flask?


By default Flask uses template files stored in the "templates" directory:

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

Is there any way to dynamically choose a template directory according to the logged-in user?

This is how I want the directory structure to be:

/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

Now if I have the username of the logged-in user and the name of the template activated by the user, is it possible to dynamically select the directory to load template files from?

For example:

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

Instead of fixed:

/templates/

What I am trying to achieve is a WordPress-like theme system for my web application where users can upload/select themes for their website.


Solution

  • There is also the possibility to overwrite Jinja loader and set the paths where Jinja will look for the templates. Like:

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

    Directories are arranged in the order where Jinja needs to first start looking for it. Then from the view you can render user specific template like this:

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

    where username you can dinamically change in the view. Of course you can also there choose which template (1 or 2) to render. But basically what you really miss is this custom Jinja loader with the custom paths.

    Hope that helped or gave the ideas :)