Python全棧工程師之從網頁搭建入門到Flask全棧專案實戰(4)

2022-12-06 18:00:54

1.Flask模板介紹

前置:理解渲染機制即上篇筆記中render_template()功能是如何實現的!

1)找到html檔案地址

2)讀取html檔案中的內容

3)替換html中的特殊字元

4)將html的內容傳送給瀏覽器

 1 <!-- html檔案 -->
 2 
 3 <!DOCTYPE html>
 4 <html lang="en">
 5 <head>
 6     <meta charset="UTF-8">
 7     <title>Title</title>
 8 </head>
 9 <body>
10     <nav>
11         導覽列
12     </nav>
13     <h1 style="color: #f00">你好, 當前的時間是:{{time}} {{user}}</h1>
14 </body>
15 </html>
 1 # Flask py檔案
 2 
 3 import os
 4 from datetime import datetime
 5 
 6 from flask import Flask,render_template
 7 app = Flask(__name__)
 8 
 9 
10 @app.route('/')
11 def index():
12     return 'index'
13 
14 
15 @app.route('/html')
16 def html_from_file():
17     """ 把html檔案的內容在瀏覽器展現出來"""
18     return render_template('index.html')
19 
20 
21 @app.route('/show/html')
22 def html_show():
23     """ 理解渲染機制 """
24     # 1. 找到磁碟上的html檔案地址(全路徑)
25     file_name = os.path.join(os.path.dirname(__file__), 'templates', 'index.html')
26     print(file_name)
27     # 2. 讀取html檔案中的內容
28     now_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
29     with open(file_name, 'r', encoding='utf-8') as f:
30         html = f.read()
31         # 3. 替換html中的特殊字元({{time}})
32         html = html.replace('{{time}}', now_time)
33         # 4. 將html的內容傳送給瀏覽器
34         return html

 

什麼是模板?

  • 模板其實是一個包含響應文字的檔案,其中用預留位置(變數)表示動態部分,告訴模板引擎其具體的值需要從使用的資料中獲取
  • 使用真實值替換變數,再返回最終得到的字串,這個過程稱為渲染

 

為什麼學模板?剛剛的範例程式碼,將所有的業務邏輯程式碼都寫在一個py檔案裡面,公共的業務變更需要修改多處程式碼;掌握模板之後,就可以解決上述問題。

 

2.入門Flask模板

2.1.模板引擎Jinja2

模板引擎:可以簡單理解為,它就是對模板(html)中的內容按照一定規則(變數)進行替換。得到最終我們給使用者端展示的頁面(模板)

  • Flask使用Jinja2作為預設模板引擎,安裝Flask的時候已經自動安裝了;不需要再次安裝Jinja2了
  • 如果不是Flask框架,是其他框架想要使用模板引擎,也是可以安裝的。通過pip進行安裝:pip install Jinja2;或者通過原始碼安裝:python setup.py install(把原始碼先下載下來,進入setup.py檔案的目錄)

 

Jinja2的預設設定

  • template_folder='templates':這個是模板存放的預設目錄,也可以自定義但是不建議改,就用它預設的就行了,便於專案成員理解共識

 

  • render_template():(x)html自動跳脫,把html讀取出來,也可以對它裡面一些變數進行替換,在Jinja2裡面這些變數的格式為雙大括號開頭,雙大括號結尾,如:{{name}}
  • render_template_string():字串自動跳脫,html是以字串賦值給一個變數的時候,可以用這個方法,可以將html響應結果展示出來;如果跟render_template一樣傳html檔名時,render_template_string是不會讀取裡面檔案的,只會將這個檔名展示出來

  • {% autoescape %}:手動設定是否跳脫
  • 全域性函數和輔助物件:增強模板的功能

 

什麼是跳脫?

把有特殊意義的字元顯示出來,例如:

  • html標籤中的<>:&lt;&gt;
  • 程式碼中的&:&amp;
  • 特殊字元跳脫對照表;詳細的可以百度鍵入關鍵字「HTML特殊跳脫字元對照表」進行搜尋

範例:

 

2.2.模板常用全域性物件

  • config:Flask的設定資訊

  • request:請求的物件
  • session:對談物件
  • g:請求相關的全域性變數(如:g.user)

 

2.3.模板常用全域性函數

  • url_for():URL解析函數(如:靜態檔案地址解析、連結跳轉地址解析);傳入檢視函數,顯示其url路徑;

常用場景:html常常會進行href頁面跳轉,如果直接指定路由(即路徑),當檢視函數路由發生變更時,就會找不到。實際開發中路由地址會變,但是檢視函數一般不會變,這時候我們就可以使用url_for對檢視函數進行反向解析獲取其路由,這樣html頁面就能正常跳轉了