2012-11-28 9 views
33

Per pallone default utilizza file di template memorizzati nella directory "template":Come selezionare dinamicamente la directory dei modelli da utilizzare nel pallone?

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

Esiste un modo per scegliere dinamicamente directory dei modelli Secondo l'utente loggato? Questo è come voglio che la struttura di directory di essere:

/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 

Ora, se ho il nome utente di login utente e il nome del modello di attivazione da parte dell'utente, è possibile selezionare in modo dinamico la directory per caricare i file di modello? Ad esempio,

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

invece di fissare

/templates/ 

Quello che sto cercando di realizzare è un sistema di wordpress come tema per la mia applicazione web in cui gli utenti possono caricare/selezionare i temi di suo sito web.

risposta

31

V'è inoltre la possibilità di sovrascrivere Jinja caricatore e impostare i percorsi dove Jinja andrà a cercare i modelli. Come:

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

directory sono disposte nell'ordine in cui Jinja deve iniziare prima a cercarlo. Quindi dal punto di vista si può rendere modello specifico utente in questo modo:

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

dove username è possibile cambiare dinamicamente nella vista. Ovviamente puoi anche scegliere quale template (1 o 2) renderizzare. Ma in pratica quello che ti manca davvero è questo caricatore personalizzato Jinja con i percorsi personalizzati.

Speranza che ha aiutato o dato le idee :)

+5

Non è necessario sfuggire a newline in Python all'interno di elenchi o dichiarazioni di dicts. – fiatjaf

+0

Nel caso qualcuno abbia problemi: questo non funziona in Heroku. Devi passare il percorso senza il primo '/' (come ''flaskapp/userdata''). – fiatjaf

+0

Questo non ha funzionato per me. Aiuto – Kishan

55

È possibile passare al costruttore Flask un argomento "template_folder".

Come così ...

Flask(__name__, template_folder="wherever") 

Ecco la documentazione: http://flask.pocoo.org/docs/api/

+0

E anche se avete intenzione di usare i modelli, possono anche avere template personalizzato dir troppo. –

0

Sono nuovo di Python, ma ho già affrontato questo problema. Non so se la mia soluzione è giusta, ma funziona:

Prima di tutto è necessario creare il modulo per ogni utente

/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    

in application.py init Flask app, aggiungere il metodo render_page_from globale e register schemi

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) 

in ciascun modulo (utente1, utente2 ecc) init progetto in 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 

infine aggiungere metodi vista (azione) a views.py come questo

from LocalHub.client import controller 
@controller.route('/hello') 
def hello(): 
    """Renders the page""" 
    return render_page_from(controller.name, 'hello.html', title='hello') 
Problemi correlati