Подтвердить что ты не робот

Как динамически выбрать каталог шаблонов, который будет использоваться в колбе?

По умолчанию флажок использует файлы шаблонов, хранящиеся в каталоге "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, например, для моего веб-приложения, где пользователи могут загружать/выбирать темы для своего веб-сайта.

4b9b3361

Ответ 1

Существует также возможность перезаписать загрузчик 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 с настраиваемыми путями.

Надеюсь, что это помогло или дало идеи:)

Ответ 2

Вы можете передать конструктору Flask аргумент "template_folder".

Так же...

Flask(__name__, template_folder="wherever")

Здесь документация: http://flask.pocoo.org/docs/api/

Ответ 3

Я новичок в 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)

в каждом модуле init1 (user1, user2 и т.д.) init в init.py

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')