
timg (11).jpg
靜态檔案通路原理
app檔案夾下建立檔案夾static,放入一張圖檔demo.jpg,然後通路伺服器啟動預設位址127.0.0.1:81/static/demo.jpg就可以通路到這張圖檔。
問:為什麼Flask可以在任何代碼不編寫的情況下自動讀取到static目錄下的圖檔檔案?
答:因為Flask對于靜态檔案是有預設值設定的,預設情況下,Flask認為靜态檔案夾的名字就叫ststic,并且位于應用程式的根目錄下的,也就是app檔案夾目錄下。
image.png
問:為什麼應用程式根目錄是app目錄而不是app上邊的flaskDemo目錄?
答:因為在執行個體化Flask核心對象是傳入了一個參數,如下代碼:
def create_app():
app = Flask(__name__)
app.config.from_object('app.secure')
app.config.from_object('app.setting')
register_blueprint(app)
db.init_app(app)
db.create_all(app=app)
return app
__name__
這個參數決定了我們應用程式的根目錄是app目錄。
如果不想使用預設的static作為靜态檔案存儲路徑,可以通過更改配置來通路,
app = Flask(__name__, static_folder='web/img')
更改成為這個路徑,就要這樣通路:127.0.0.1:81/img/demo.jpg,
還可以這麼改:
app = Flask(__name__, static_folder='web/img', static_path='')
但是我們一般還是使用Flask預設設定即可,如果确實有需求,具體使用詳情請查閱官方文檔。
靜态檔案放到藍圖中
之前說過,Flask裡有兩個層級:
- Flask核心對象:應用程式級别
- 藍圖
對于靜态檔案,也有兩個級别:
- 應用程式static
- 藍圖static
如果你認為你的靜态檔案是針對你的藍圖的話,那麼你其實是可以把靜态檔案注冊到藍圖上邊,而不是注冊到應用程式上邊。
藍圖的相關方法其實幾乎就是複制了Flask核心對象的api,基本參數都是一緻的。
藍圖注冊靜态檔案夾:
from flask import Blueprint
# 藍圖
web = Blueprint("web", __name__, static_folder='', static_url_path='')
模闆檔案
模闆就是html,但是和普通html不同,模闆是沒有資料的,它等待填充資料。
app檔案夾下建立檔案夾templates,建立html檔案:test.html:
同上邊提到的static檔案夾一樣,我們可以自定義templates檔案夾的位置,通過更改
template_folder=
參數來自定義templates檔案夾的位置,例如,把templates檔案夾移動到web檔案夾下後需改動:
兩種更改方法:
- Flask核心對象上更改:
app = Flask(__name__, template_folder='web/templates')
- 在藍圖對象上更改:
web = Blueprint("web", __name__, template_folder='templates')
現在要把視圖函數中傳回的資料填充到模闆test.html中,使用Flask内置的方法:
render_template()
from flask import render_template
@web.route('/test')
def test():
r = {
"name": "allen",
'age': 24
}
r1 = {
"name": "zhao",
"age": 12
}
return render_template('test.html', data=r, data1=r1)
模闆語言 Jinja2
如何在模闆中組織、解析相關資料
編輯test.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>demo</h1>
{{data.age}}
{{data1.age}}
</body>
</html>
運作代碼,浏覽器輸入127.0.0.1:8000/test
可以看到,之前我們寫在視圖函數中的資料已經展示到頁面了。
Flask為了讓我們很好的在模闆解析和展示資料,它引入了一個模闆引擎,叫做Jinja2。
Jinja2有自己的文法,例如注釋代碼:{#hello word#},這裡就把hello word注釋掉了。
我們的pycharm預設是不會像寫python代碼一樣智能提示Jinja2的文法,但是,更改設定即可:
Jinja2也叫做模闆語言,
Flask官方推薦我們使用Jinja2,大家也可以自己使用其他的模闆語言。