Cómo seleccionar dinámicamente directorio de la plantilla para ser utilizada en el frasco?

Por defecto matraz utiliza la plantilla de los archivos almacenados en la plantilla «directorio»:

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

Hay alguna forma de elegir dinámicamente directorio de la plantilla de acuerdo con el usuario logueado? Esta es la forma en que quiero que la estructura de directorios a ser :

/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

Ahora si tengo el nombre de usuario de inicio de sesión de usuario y el nombre de la plantilla activado por el usuario, es posible seleccionar de forma dinámica el directorio para cargar los archivos de plantilla? Por ejemplo,

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

lugar de fijas

/templates/

Lo que estoy tratando de lograr es un wordpress como sistema del tema de mi aplicación web donde los usuarios pueden subir/la selección de temas para su sitio web.

InformationsquelleAutor anujkk | 2012-11-28

3 Kommentare

  1. 40

    También existe la posibilidad de sobrescribir Jinja cargador y el conjunto de las rutas en Jinja buscará las plantillas. Como:

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

    Directorios están organizados en el orden en donde Jinja primero debe empezar a buscar para él. A continuación, desde el punto de vista se puede representar de usuario específicos de la plantilla como esta:

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

    donde el nombre de usuario puede cambiar dinámicamente en la vista. Por supuesto, usted puede también elegir qué plantilla (1 o 2) para el render. Pero básicamente lo que realmente echo de menos es esta costumbre Jinja cargador con las rutas de acceso personalizadas.

    La esperanza de que los ayudó o le dio las ideas 🙂

    • Usted no tiene que salir de saltos de línea en Python dentro de listas o dicts declaraciones.
    • En caso de que alguien está teniendo problemas: esto no funciona en Heroku. Usted tiene que pasar la ruta de acceso sin la primera / (como 'flaskapp/userdata').
    • Esto no funciona para mí. Ayuda
    • Excluir la app.jinja_loader línea para utilizar sólo los dos carpetas mencionadas
    • No funciona , frasco 1.0.2, template not found
  2. 93

    Puede pasar el Matraz constructor de un «template_folder» argumento.

    Así…

    Flask(__name__, template_folder="wherever")

    Aquí está la documentación:
    http://flask.pocoo.org/docs/api/

    • Y también si se va a utilizar planos, también pueden tener plantilla personalizada dir demasiado.
    • Usando modelos no funciona bien con dos caminos diferentes, pero render_template mismo nombre de la plantilla
  3. 2

    Soy nuevo en Python, pero ya me he enfrentado con este problema. No sé si mi solución es correcta, pero funciona:

    Primer lugar, usted tiene que crear el módulo para cada usuario

    /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              

    en application.py init Matraz de aplicación, agregar método global render_page_from y registro de planos

    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)

    en cada módulo (user1, user2, etc) init plano en 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

    por último añadir la vista (acción) los métodos para views.py como este

    from LocalHub.client import controller
    @controller.route('/hello')
    def hello():
        """Renders the page"""
        return render_page_from(controller.name, 'hello.html', title='hello')
    • No funciona, imprime corregir la ruta de búsqueda pero procesamiento incorrecto de la plantilla.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea