2014-07-23 65 views
2

我的藍圖應該在根目錄下尋找靜態文件,但事實並非如此。燒瓶藍圖尋找藍圖中的靜態文件而不是根目錄

說我有一個名爲「前端」藍圖。 「前端」只有在。

過去了就算我把靜態文件下/app/frontend/static/file.css template_folder =「前端」,它沒有找到它。它也沒有在/app/static/file.css中找到它。

控制檯Web服務器,以便每次每個CSS或JS靜態文件說:「404」。

但我做的時候我打印出來url_maps有這樣的表現:

<Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>]) 

我發起register_blueprint( '前端')這樣的。

frontend = Blueprint('frontend', __name__,template_folder='templates') 

我的看法回報指數:

return render_template('frontend.html', pagination=pagination) 

frontend.html可以/app/frontend/templates

唯一的工作。如果你把frontend.html/app/templates它也不在那裏工作。即使你刪除了「template_folder」參數。

文件結構:

app 
-app.py 
--frontend 
--frontend/templates contains: (frontend.html) (base.html) (errors/404.html) 
--static 
--static/css (bootstrap.min.css) (what I want to grab with url_for inside base.html) 

回答

3

1.模板

每個燒瓶應用,藍圖和模塊具有jinja_loader。當你的render_template開始找到你的模板之前,在應用程序中找到,然後在每個藍圖(見get_source_iter_loader),直到找不到第一個存在的文件。

jinja_loader從對象的路徑和模板文件夾名稱,例如建立,如果/home/www/myapp/usr/lib/python3.4/site-packages/myapp)文件夾,比全模板文件夾template文件夾的應用程序,藍圖或模塊將/home/www/myapp/template/usr/lib/python3.4/site-packages/myapp/template)。

這意味着,如果你在應用程序模板文件夾中的文件,那麼你渲染它,即使你在藍圖呈現模板。另外,如果您在應用程序模板文件夾中沒有文件,但是藍圖中的任何文件都會顯示鋼。因此,藍圖更好地使用獨特的模板前綴以避免模板覆蓋(falsk_admin - admin/模板前綴)。

例如,對於擴展它有助於在包裝使用的模板和已經有能力取代它在你的應用程序,如果你需要它(如果你只想繼承你需要的模板給新名稱)。

2。URL規則

規則沒有任何藍圖前綴 - 在blueprint中,您只需連接前綴和規則,然後使用它。

所以所有的url規則都會用現有規則解決(請參閱另一個回答https://stackoverflow.com/a/17146563/880326)。

您可以擁有相同的url規則說明(/static/static)並且只有一個端點。

3.靜態文件

默認情況下應用程序存在靜態文件夾。對於藍圖,您應該添加static_folder參數。但是,如果兩個規則都具有相同的描述,那麼默認情況下您無法從兩個文件中獲取文件(使用little code即可)。

對於燒瓶應用程序,藍圖和模塊完全靜態文件夾依賴形式root_path這取決於__name__參數。

但是,如果你有沒有url前綴的藍圖,最好設置另一個static_url_path以避免錯誤。

+0

我的意思是不是哲學上的設計,以便您可以從「root/app/static」目錄中「common」static_files以及從/ app/blueprint/static文件夾中獲取特定於藍圖的文件?它不應該檢查默認情況下,否則每個藍圖將重複相同的文件?我認爲它應該是標準的,它應該首先看ROOT靜態,然後在藍圖的靜態。 – Dexter

+0

有點不同意,因爲藍圖更獨立,比如你可以使用admin模塊,使用1.9.0的jquery.js和2.0.0的jquery.js使用主應用程序。另外一些文件可以具有相同的名稱,如'styles.css'。只是我的意見:如果藍圖不使用應用程序靜態,則爲靜態應用程序和藍圖使用不同的URL。 – tbicr

0

嘗試創建Blueprint時加入static_folder='static'

此外,還可以使用url_for功能神社打印出你的靜態路徑。

{{ url_for(".static", filename="css/bootstrap.min.css") }}

+0

不,這不起作用。藍圖前端中的視圖仍然無法檢測root-app/app/templates文件夾中的模板。它也爲任何靜態文件提供404。儘管同時有'(HEAD,OPTIONS,GET) - > static>, '(HEAD,OPTIONS,GET) - > frontend.static>])...會不會有某種路徑,傾聽或權限問題? – Dexter

+0

這是爲了標題的問題,靜態和模板是兩個不同的東西。如果按照我上面所寫的完成,靜態文件應該可以工作。即使您另有說法,如果您在創建「藍圖」時刪除了'template_folder ='模板'',模板應該可以工作。有關示例,請參閱https://github.com/Jahaja/psdash/tree/master/psdash。 – Jahaja

+0

我終於搞定了,顯然對於靜態文件,你需要在你的static_url_path中有一個「/ app」... frontend = Blueprint('frontend',__name__,template_folder ='../templates',static_folder ='static',static_url_path ='/ app/static') – Dexter