2012-11-28 54 views
33

默認瓶使用存儲在「模板」目錄模板文件:如何動態選擇要在燒瓶中使用的模板目錄?

/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的爲我的web應用程序,用戶可以上傳/選擇的主題爲他的網站。

回答

31

還有覆蓋神社裝載機,並設置路徑,其中神社會尋找模板的可能性。像:

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加載器。

希望,幫助或給想法:)

+5

您不必在列表或者字典聲明中跳過Python中的換行符。 – fiatjaf

+0

如果有人遇到問題:這在Heroku中不起作用。你必須通過沒有第一個'/'的路徑(比如''flaskapp/userdata'')。 – fiatjaf

+0

這沒有爲我工作。幫幫我 – Kishan

55

您可以傳遞Flask構造函數一個「template_folder」參數。

是這樣的...

Flask(__name__, template_folder="wherever") 

這裏的文檔: http://flask.pocoo.org/docs/api/

+0

和如果你要使用藍圖,他們也可以自定義模板目錄了。 –

0

我是新來的Python,但我已經遇到了這個問題。我不知道如果我的解決方案是正確的,但它的工作原理:

首先,你必須在application.py初始化瓶的應用程序的每個用戶

/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    

創建模塊,添加全局方法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) 

每個模塊中(用戶1,用戶2等)在初始化的.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 
012初始化藍圖

最後加視圖(動作)方法的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')