jinja2是flask開發過程中對應的模板引擎,默認的情況下是不用單獨安裝的,在我們安裝flask的時候就已經安裝好了,直接用就可以。
在開始學習flask模板相關的語法的時候,我們需要先簡單學習一下flask-script
這個開發過程中比較常用的flask擴展。
一、flask-script簡單學習
flask-script這個擴展主要是在我們開發過程中使用,最直接的用途是給我們的flask項目添加一個命令行的擴展,便于開發測試,這個類似django的命令行。
1、flask-script安裝
pip install flask-script
安裝成功之后,在使用的時候,和其他flask擴展一樣,需要我們的導入,絕大多數的教程都介紹導入兩個方法Manager
和Server
,但是這里我們只導入Manager
,Server
為了后面學習jinja2,使用Livereload
這個python擴展,方便調試模板。
2、flask-script使用
from flask-script import Manager
#省略部分代碼
manager = Manager(app)
if __name__ == '__main__':
manager.run()
上述代碼中的第二行是實例化Manager,絕大多數的flask擴展都需要用到實例化,后面我們學習其他的flask擴展會繼續介紹這方面的內容。
二、livereload簡單學習
livereload也是開發過程中能夠提升效率的一個python包,注意這個不是flask的擴展,livereload的作用是,當我們保存完所修改的文件之后,服務器能夠自動執行。
開始的時候小蝦也覺得貌似沒什么用,因為我們有debug=Ture
,但是事實上發現還是很有用的,debug只能讓我們的后端文件重新執行,前端文件還需要我們手動來刷新,但是使用了livereload,只要監控了的文件,都能幫我們重新執行,很方便的。
1、livereload安裝
安裝的過程中發現,通過venv環境下使用pip install安裝,即使提示安裝成功,但是在import引入的時候依然無法引入,這個問題還沒找到原因,后來通過pycharm的設置安裝,安裝成功,然后可以正常使用,搜索了一下這方面的問題,發現知乎上也有人問。。。
2、livereload使用
在使用livereload的時候也需要導入,然后配合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)
運行的話也有點特殊,這個時候需要我們加上command命令運行,具體的代碼如下:
python sample.py dev
然后不出意外,我們就看到如下圖所示的成功運行的圖,另外瀏覽器會自動打開并運行我們的項目。
三、flask jinja2簡單語法
在后端,我們需要使用render_template('模板文件','模板變量=變量')來和指定的模板進行溝通。比如下面的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>
這個時候訪問我們的127.0.0.1:5000就應該看到下面的內容
如果信心的話,發現h1標簽并沒有實現我們想象中的效果,被過濾掉了,但是事實上我們希望的是能夠正確被解析,這里就要說到jinja2的過濾器了。
1、jinja2過濾器
jinja2過濾器主要作用是將從后端文件傳過來的參數進行一些裝飾,然后再在頁面進行渲染,比如上面的例子,如果默認不做上面的話,h1為了安全起見是被過濾掉的,但是如果我們確認接受過來的參數title是安全的,那就可以通過safe
進行過濾,具體如下:
{{ title|safe }}
這個時候我們訪問頁面,就會看到下面的內容:
2、自定義jinja2過濾器
jinja2給我們提供了大量的過濾器,具體的話可以通過訪問jinja2官方頁面進行查詢,但是有時候我們需要自己的過濾器,這個時候可以通過自定義jinja2過濾器來實現。
jinja2自定義過濾器主要是通過注冊自定義函數到jinja2模板上,使用的到的命令是@app.template_filter('過濾器名字')
,這里以一個能夠支持markdown的過濾器為例說明。
@app.template_filter('md')
def markok(txt):
from markdown import markdown
return markdown(txt)
不加md
過濾器,默認輸出的文件是下面的:
我們加上md
過濾器,輸出的結果如下圖:
說明我們的自定義過濾器執行成功了。jinja2模板的過濾器可以同時使用多個,都是通過|鏈接,這個類似shell中的管道。
四、學習心得
flask學習過程中,知識真的很多,flask有N多的擴展,每一個擴展又有N多的用法,都一次性學習的話,顯然對于新手的我來說是一個比較痛苦的過程,所以學習的過程中遵循一個“用什么學什么”的原則,先把最常用的功能了解一下,其他的知識,在開發過程中用什么學什么。這樣效率會更高點。