Flask模板

Flask可以以HTML形式返回綁定到某個URL的函數的輸出。 例如,在以下腳本中,hello()函數將使用附加的<h1>標記呈現‘Hello World’

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return '<html><body><h1>'Hello World'</h1></body></html>'

if __name__ == '__main__':
    app.run(debug = True)

但是,從Python代碼生成HTML內容非常麻煩,尤其是在需要放置可變數據和Python語言元素(如條件或循環)時。經常需要轉義HTML代碼。

它可以利用Jinja2模板引擎技術,而不需要從函數返回硬編碼HTML。如下代碼所示,可以通過render_template()函數渲染HTML文件。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
   return render_template(‘hello.html’)

if __name__ == '__main__':
   app.run(debug = True)

Flask將嘗試在該腳本所在的同一文件夾中查找templates文件夾中的HTML文件。使用模板的應用程序目錄結構如下所示 -

app.py
hello.py
    templates
        hello.html
        register.html
        ....

術語「Web模板系統」是指設計一個HTML腳本,其中可以動態插入變量數據。 Web模板系統由模板引擎,某種數據源和模板處理器組成。

Flask使用jinga2模板引擎。 Web模板包含用於變量和表達式(這些情況下爲Python表達式)的HTML語法散佈佔位符,這些變量和表達式在模板呈現時被替換爲值。

以下代碼在模板(templates)文件夾中保存爲:hello.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask HTTP請求方法處理</title>
</head>
   <body>

      <h1>Hello {{ name }}!</h1>

   </body>
</html>

接下來,將以下代碼保存在app.py文件中,並從Python shell運行 -

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/hello/<user>')
def hello_name(user):
    return render_template('hello.html', name = user)

if __name__ == '__main__':
    app.run(debug = True)

在開發服務器開始運行時,打開瀏覽器並輸入URL爲 - http://localhost:5000/hello/maxsu

URL的可變部分插入{{name}}佔位符處。

Flask模板

Jinja2模板引擎使用以下分隔符來從HTML轉義。

  • {% ... %} 用於多行語句
  • {{ ... }} 用於將表達式打印輸出到模板
  • {# ... #} 用於未包含在模板輸出中的註釋
  • # ... ## 用於單行語句

在以下示例中,演示了在模板中使用條件語句。 hello()函數的URL規則接受整數參數。 它傳遞給hello.html模板。 在它裏面,收到的數字(標記)的值被比較(大於或小於50),因此在HTML執行了有條件渲染輸出。

Python腳本如下 -

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/hello/<int:score>')
def hello_name(score):
    return render_template('hello.html', marks = score)

if __name__ == '__main__':
    app.run(debug = True)

模板文件:hello.html 的HTML模板腳本如下 -

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask模板示例</title>
</head>
   <body>

      {% if marks>50 %}
      <h1> 通過考試!</h1>
      {% else %}
      <h1>未通過考試!</h1>
      {% endif %}

   </body>
</html>

請注意,條件語句if-elseendif包含在分隔符{%..。%}中。

運行Python腳本並訪問URL=> http://localhost/hello/60 ,然後訪問 http://localhost/hello/59,以有條件地查看HTML輸出。

Python循環結構也可以在模板內部使用。 在以下腳本中,當在瀏覽器中打開URL => http:// localhost:5000/result時,result()函數將字典對象發送到模板文件:results.html

result.html 的模板部分採用for循環將字典對象result{}的鍵和值對呈現爲HTML表格的單元格。

從Python shell運行以下代碼。

from flask import Flask, render_template
app = Flask(__name__)

@app.route('/result')
def result():
    dict = {'phy':59,'che':60,'maths':90}
    return render_template('result.html', result = dict)

if __name__ == '__main__':
    app.run(debug = True)

將以下HTML腳本保存爲模板文件夾(templates)中的模板文件:result.html

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Flask模板示例</title>
</head>
   <body>
      <table border = 1>
         {% for key, value in result.items() %}
            <tr>
               <th> {{ key }} </th>
               <td> {{ value }} </td>
            </tr>
         {% endfor %}
      </table>
   </body>
</html>

在這裏,與For循環相對應的Python語句包含在{%...%}中,而表達式鍵和值放在{{}}中。

開發開始運行後,在瀏覽器中打開http://localhost:5000/result以獲得以下輸出。

Flask模板