jinja2是flask開發(fā)過程中對應(yīng)的模板引擎,默認(rèn)的情況下是不用單獨(dú)安裝的,在我們安裝flask的時(shí)候就已經(jīng)安裝好了绎晃,直接用就可以泊柬。
在開始學(xué)習(xí)flask模板相關(guān)的語法的時(shí)候椎镣,我們需要先簡單學(xué)習(xí)一下flask-script
這個(gè)開發(fā)過程中比較常用的flask擴(kuò)展。
一兽赁、flask-script簡單學(xué)習(xí)
flask-script這個(gè)擴(kuò)展主要是在我們開發(fā)過程中使用状答,最直接的用途是給我們的flask項(xiàng)目添加一個(gè)命令行的擴(kuò)展,便于開發(fā)測試刀崖,這個(gè)類似django的命令行惊科。
1、flask-script安裝
pip install flask-script
安裝成功之后亮钦,在使用的時(shí)候馆截,和其他flask擴(kuò)展一樣,需要我們的導(dǎo)入,絕大多數(shù)的教程都介紹導(dǎo)入兩個(gè)方法Manager
和Server
蜡娶,但是這里我們只導(dǎo)入Manager
,Server
為了后面學(xué)習(xí)jinja2混卵,使用Livereload
這個(gè)python擴(kuò)展,方便調(diào)試模板窖张。
2幕随、flask-script使用
from flask-script import Manager
#省略部分代碼
manager = Manager(app)
if __name__ == '__main__':
manager.run()
上述代碼中的第二行是實(shí)例化Manager,絕大多數(shù)的flask擴(kuò)展都需要用到實(shí)例化宿接,后面我們學(xué)習(xí)其他的flask擴(kuò)展會(huì)繼續(xù)介紹這方面的內(nèi)容赘淮。
二、livereload簡單學(xué)習(xí)
livereload也是開發(fā)過程中能夠提升效率的一個(gè)python包睦霎,注意這個(gè)不是flask的擴(kuò)展梢卸,livereload的作用是,當(dāng)我們保存完所修改的文件之后碎赢,服務(wù)器能夠自動(dòng)執(zhí)行低剔。
開始的時(shí)候小蝦也覺得貌似沒什么用,因?yàn)槲覀冇?code>debug=Ture肮塞,但是事實(shí)上發(fā)現(xiàn)還是很有用的襟齿,debug只能讓我們的后端文件重新執(zhí)行,前端文件還需要我們手動(dòng)來刷新枕赵,但是使用了livereload猜欺,只要監(jiān)控了的文件,都能幫我們重新執(zhí)行拷窜,很方便的开皿。
1、livereload安裝
安裝的過程中發(fā)現(xiàn)篮昧,通過venv環(huán)境下使用pip install安裝赋荆,即使提示安裝成功,但是在import引入的時(shí)候依然無法引入懊昨,這個(gè)問題還沒找到原因窄潭,后來通過pycharm的設(shè)置安裝,安裝成功酵颁,然后可以正常使用嫉你,搜索了一下這方面的問題,發(fā)現(xiàn)知乎上也有人問躏惋。幽污。。
2簿姨、livereload使用
在使用livereload的時(shí)候也需要導(dǎo)入距误,然后配合manager.command修飾器使用,具體代碼如下:
@manager.command
def dev():
from livereload import Server
live_server = Server(app.wsgi_app)
live_server.watch('**/*.*')
live_server.serve(open_url=True)
運(yùn)行的話也有點(diǎn)特殊,這個(gè)時(shí)候需要我們加上command命令運(yùn)行深寥,具體的代碼如下:
python sample.py dev
然后不出意外攘乒,我們就看到如下圖所示的成功運(yùn)行的圖,另外瀏覽器會(huì)自動(dòng)打開并運(yùn)行我們的項(xiàng)目惋鹅。
三、flask jinja2簡單語法
在后端殉簸,我們需要使用render_template('模板文件','模板變量=變量')來和指定的模板進(jìn)行溝通闰集。比如下面的index視圖。
sample.py文件部分代碼如下:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html',title="<h1>hello world</h1>")
if __name__ == '__main__':
app.run()
index.html文件代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
{{ title }}
</body>
</html>
這個(gè)時(shí)候訪問我們的127.0.0.1:5000就應(yīng)該看到下面的內(nèi)容
如果信心的話般卑,發(fā)現(xiàn)h1標(biāo)簽并沒有實(shí)現(xiàn)我們想象中的效果武鲁,被過濾掉了,但是事實(shí)上我們希望的是能夠正確被解析蝠检,這里就要說到j(luò)inja2的過濾器了沐鼠。
1、jinja2過濾器
jinja2過濾器主要作用是將從后端文件傳過來的參數(shù)進(jìn)行一些裝飾叹谁,然后再在頁面進(jìn)行渲染饲梭,比如上面的例子,如果默認(rèn)不做上面的話焰檩,h1為了安全起見是被過濾掉的憔涉,但是如果我們確認(rèn)接受過來的參數(shù)title是安全的,那就可以通過safe
進(jìn)行過濾析苫,具體如下:
{{ title|safe }}
這個(gè)時(shí)候我們訪問頁面兜叨,就會(huì)看到下面的內(nèi)容:
2、自定義jinja2過濾器
jinja2給我們提供了大量的過濾器衩侥,具體的話可以通過訪問jinja2官方頁面進(jìn)行查詢国旷,但是有時(shí)候我們需要自己的過濾器,這個(gè)時(shí)候可以通過自定義jinja2過濾器來實(shí)現(xiàn)茫死。
jinja2自定義過濾器主要是通過注冊自定義函數(shù)到j(luò)inja2模板上跪但,使用的到的命令是@app.template_filter('過濾器名字')
,這里以一個(gè)能夠支持markdown的過濾器為例說明璧榄。
@app.template_filter('md')
def markok(txt):
from markdown import markdown
return markdown(txt)
不加md
過濾器特漩,默認(rèn)輸出的文件是下面的:
我們加上md
過濾器,輸出的結(jié)果如下圖:
說明我們的自定義過濾器執(zhí)行成功了骨杂。jinja2模板的過濾器可以同時(shí)使用多個(gè)涂身,都是通過|鏈接,這個(gè)類似shell中的管道搓蚪。
四蛤售、學(xué)習(xí)心得
flask學(xué)習(xí)過程中,知識真的很多,flask有N多的擴(kuò)展悴能,每一個(gè)擴(kuò)展又有N多的用法揣钦,都一次性學(xué)習(xí)的話,顯然對于新手的我來說是一個(gè)比較痛苦的過程漠酿,所以學(xué)習(xí)的過程中遵循一個(gè)“用什么學(xué)什么”的原則冯凹,先把最常用的功能了解一下,其他的知識炒嘲,在開發(fā)過程中用什么學(xué)什么宇姚。這樣效率會(huì)更高點(diǎn)。