Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2
前面看了Flask的Quickstart文檔,可是,一直沒有練習里面的內容,這不,剛剛練習完畢,來寫篇博文記錄一下!
靜態文件
我的Flask項目時一個單獨的模塊,因此,要使用靜態文件,只需要在模塊所在目錄下建立static文件夾,然后把靜態文件放入其中。
Flask項目啟動后,使用“/static/”加上<文件名>就可以訪問靜態文件了。
/static/<文件名>
說明,在Quickstart文檔中,如果Flask項目是package的話,將static文件夾放到package的根目錄下。
我的測試是放了一個html文件進入,命名為static1.html,代碼如下:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Static Files Test</title> 6 </head> 7 <body> 8 <h1>This is the first satic file of Flask.</h1> 9 </body> 10 </html>
然后,啟動hello.py模塊:成功
訪問上面建立的靜態文件:成功
什么是靜態文件呢?CSS、JavaScript、圖片、音頻、視頻,甚至HTML文件都是……在我看來,只要放到static文件夾中,就是“靜態文件”。
當然,在Quickstart文檔介紹中,只提到了CSS、JavaScript文件。需要進行測試,並找更多資料來證明。
在Quickstart文檔中介紹的靜態文件的使用內置服務器僅適用於項目開發階段,在生產環境部署時,靜態文件是由Web服務器(比如Nginx)
處理、分發的。
很簡單、快捷,的確。
模板
為什么使用模板?將數據和視圖分離,分離之后,再使用模板引擎將兩者生成帶數據頁面(專業名詞叫 渲染(Render))返回給客戶端瀏覽器。
Flask的模板引起是 Jinja2。
Quickstart中介紹了一個render_template()函數來渲染模板,並將一個name變量渲染到了模板中,代碼如下:
1 return render_template('hello.html', name=name)
在hello.html中一定定義了變量{{ name }}。
模板文件放在哪里?
按照下面的說明創建templates文件夾,,
-項目是一個模塊,放到和模塊同一目錄下;
-項目是package,放到package的根目錄下;
然后,將模板文件放入templates文件夾即可。
說明,和前面介紹的static文件夾位置相同。
接下來,建立一個模板文件tmpt1.html進行測試,源碼如下:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Rendering Templates test</title> 6 </head> 7 <body> 8 {{ name }} 9 </body> 10 </html>
上面的模板文件僅僅定義了一個變量{{ name }}。
目前接觸的模板文件都是HTML文件,是否可以是其它文件呢?還需更多了解。
然后,在hello.py中編寫處理模板渲染的URL處理函數:
1 @app.route("/tmpt") 2 def tmptTest(): 3 ctx = {} 4 ctx['name'] = 'Benjamin' 5 return render_template('tmpt1.html', **ctx)
啟動項目,訪問/tmpt鏈接:成功輸出處理函數中需要被渲染的數據
進一步測試: 在模板文件中添加處理函數中沒有的參數
前面的模板文件中添加了一個變量{{ name }},現在,再添加一個變量{{ yourname }},保持處理函數不變——仍然只提供一個name。
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Rendering Templates test</title> 6 </head> 7 <body> 8 {{ name }}<br /> 9 {{ yourname }}<br /> 10 </body> 11 </html>
啟動項目,訪問頁面:頁面和之前一樣,不過,Chrome的控制台沒有報錯。
千萬注意,在更新模板文件后,一定要重啟項目!否則,新的模板文件是不會生效的!~經過測試,項目模塊文件更新后,也需要
重啟才會生效!~總之,只要有改動,那邊重啟項目!
下面是更新后的項目模塊文件,及重啟后訪問到的頁面:顯示了name、yourname變量的內容。
測試模板是遇到的錯誤:
在第一次使用render_template()函數時,將字典參數ctx直接寫進入,然后啟動得到如下錯誤:
提示我render_template()函數只有一個位置參數,而我給了兩個!那么,我用錯了!
查看render_template()函數的文檔得知,的確只有一個位置參數,然后是關鍵詞參數:
然后,給我的字典參數ctx加上兩顆星號,問題就解決了。
看來,自己對Python函數的各種參數還是不太熟悉啊!位置參數、默認值參數、關鍵詞參數~~
為什么會發生此錯誤?
一是由於沒有細查,二是因為前面使用Django的渲染函數時傳入的參數是一個字典的影響。
至此,本次測試完畢。
更多關於這方面的內容,還得查看官方文檔才是。
參考鏈接:
Quickstart之Rendering Templates