Flask原始碼閱讀(三)——渲染模板
阿新 • • 發佈:2019-01-22
1.前面的例子中(第一篇),業務邏輯和表現邏輯混合在了一起,會導致程式碼難以理解和維護。因此, 把表現路基移到模板中能提升程式的可維護性。
例:使用者在網站仲註冊了一個新賬戶。使用者在變淡中輸入嗲子郵箱地址和密碼,然後點選提交按鈕。伺服器收到包含使用者輸入資料的請求,然後Flask把請求分發到處理請求的檢視函式。這個檢視函式需要訪問資料庫,新增新使用者,然後生成響應回送瀏覽器。
其中:伺服器收到包含使用者輸入資料的請求,然後Flask把請求分發到處理請求的檢視函式,被稱為業務邏輯。
這個檢視函式需要訪問資料庫,新增新使用者,然後生成響應回送瀏覽器,被稱為表現邏輯。
2.模板是一個包含響應文字的檔案,其中包含用展位變量表示的動態部分,變數的具體指只在請求的上下文中才能知道。使用真實值替換變數,再返回最終得到的響應字串,這一過程稱為渲染 。Flask使用jinja2作為模板渲染引擎。
3.渲染模板
例:
from flask import Flask, render_template
# ...
@app.route('/')
def index():
return render_template('index.html')
@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)
新函式render_template()為jinja2提供。這樣,Flask在程式資料夾中的子資料夾中尋找模板。第一個引數是檔名,隨後的引數都是鍵值對(name=name),表示模板中變數對應的真實值。下面,讓我們看一下render_template()函式的原始碼。
4.原始碼
def render_template(template_name, **context):
"""Renders a template from the template folder with the given
context.
:param template_name: the name of the template to be rendered
:param context: the variables that should be available in the
context of the template.
"""
current_app.update_template_context(context)
return current_app.jinja_env.get_template(template_name).render(context)
可以看到,render_template函式通過current_app.update_template_context(context)
來表達context,即上下文變數(例子中的name),最後返回current_app.jinja_env.get_template(template_name).render(context)
的結果,使用env的模板環境載入名為‘tempalte_name’的模板檔案,並且渲染上下文變數(.render(context))。
重點在.jinja_env.get_template()
函式中,jinja2模板中。
這裡留作記號,回頭再讀jinja2模板。抱歉。