2012-11-28 11 views
33

Domyślnie kolby używa plików szablonu przechowywane w „Szablon” katalogu:Jak dynamicznie wybierać katalog szablonów do użycia w kolbie?

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

Czy istnieje jakiś sposób, aby dynamicznie wybrać katalog szablonu według zalogowanego użytkownika? W ten sposób chcę struktura katalogów być:

/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 

Teraz jeśli mam nazwę użytkownika zalogowanego użytkownika i nazwę szablonu aktywowany przez użytkownika, możliwe jest dynamicznie wybrać katalog, aby załadować pliki szablonów? Na przykład,

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

zamiast stałej

/templates/ 

Co staram się osiągnąć to WordPress podobnego systemu rozrywki dla mojej aplikacji internetowej, na której użytkownicy mogą przesyłać/wybrać tematy na swojej stronie internetowej.

Odpowiedz

31

Istnieje również możliwość nadpisania Jinja ładowarka i zestaw ścieżek gdzie Jinja będzie szukać szablonów. Podobnie jak:

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

Katalogi są uporządkowane w kolejności, w której Jinja musi najpierw zacząć je szukać. Następnie z widoku możesz wyrenderować szablon podobny do tego:

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

gdzie nazwa użytkownika można zmienić dinamically w widoku. Oczywiście możesz także wybrać szablon (1 lub 2) do renderowania. Ale w zasadzie to, czego naprawdę brakuje, to niestandardowy program ładujący Jinja z niestandardowymi ścieżkami.

nadzieja, że ​​pomógł lub dał pomysły :)

+5

Nie musisz uciec przed znakami nowej linii w Pythonie wewnątrz list lub deklaracji dyktowanych. – fiatjaf

+0

Jeśli ktoś ma problemy: to nie działa w Heroku. Musisz przekazać ścieżkę bez pierwszego '/' (jak '' flaskapp/userdata''). – fiatjaf

+0

To nie działa dla mnie. Wsparcie – Kishan

55

Możesz przekazać konstruktorowi Flask'a argument "template_folder".

Podobnie jak ...

Flask(__name__, template_folder="wherever") 

Oto dokumentacja: http://flask.pocoo.org/docs/api/

+0

a także jeśli masz zamiar używać ideowych, ale także może mieć własnego szablonu dir też. –

0

Jestem nowy w Pythonie, ale ja już do czynienia z tym problemem. Nie wiem, czy moje rozwiązanie jest dobre, ale to działa:

Przede wszystkim trzeba stworzyć moduł dla każdego użytkownika

/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    

w application.py Init Kolby aplikacji, dodać metodę globalną render_page_from i zarejestrować uprzednia

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) 

w każdym module (użytk1, użytkownik2 itp) startowych plan w 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 

wreszcie dodać widzenia (działania) metody views.py jak ten

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