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

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

3 Solutions collect form web for “Как динамически выбрать каталог шаблонов, который будет использоваться в колбе?”

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

наконец, добавьте методы view (action) в 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') 
Python - лучший язык программирования в мире.