1. 程式人生 > >Flask原始碼閱讀(三)——渲染模板

Flask原始碼閱讀(三)——渲染模板

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模板。抱歉。