Flask:02-秒懂Flask會話控制與模板引擎
會話控制原理
- 說明:概念百度說明的很詳細,請自行百度
cookie
-
說明:
由於HTTP協議無狀態無連線的特點,導致一個使用者在同一網站做連續操作時,需要不斷的提供身份資訊;為了解決這個問題,我們可以通過cookie攜帶特定的資訊加以解決。當首次訪問網站時設定cookie資訊,以後每次再訪問該網站時,瀏覽器會自動攜帶cookie資訊。
-
使用:
from flask import Blueprint, request, make_response cookie = Blueprint('cookie', __name__, url_prefix='/cookie') # 獲取 @cookie.route('/get/')
session
-
說明:
session是一種比cookie更加安全的攜帶資訊的方案,功能與cookie相同。
-
分類:
- server side session:資料存放在伺服器上,客戶端儲存的是seesion_id(通過cookie傳輸)
- client side session:將session資料加密編碼,然後儲存到客戶端,flask預設採用的就是這種方案
-
使用:
from flask import Blueprint, session sess = Blueprint('sess', __name__, url_prefix='/session') # 獲取 @sess.route('/get/') def get_session(): return session.get('name', 'who are you?') # 設定 @sess.route('/set/') def set_session(): # 設定有效期,預設瀏覽器關閉即失效 # 設定為True,session有效期為永久 # 永久的時間由PERMANENT_SESSION_LIFETIME配置選項決定,預設31天 session.permanent = True session['name'] = 'cuihua' return 'session已設定' # 刪除 @sess.route('/del/') def del_session(): # 刪除指定的session,第二個引數設定為None,session不存在也不報錯 # session.pop('name', None) # 清空session session.clear() return 'session已刪除'
flask-session
-
說明:將session資料儲存到伺服器的解決方案。
-
安裝:
pip install flask-session
-
使用:
from flask import Flask, session from flask_script import Manager from redis import Redis from flask_session import Session app = Flask(name) app.config['SECRET_KEY'] = '123456' app.config['SESSION_TYPE'] = 'redis' app.config['SESSION_REDIS'] = Redis() manager = Manager(app) sess = Session(app) # 可以通過兩步進行初始化 # sess.init_app(app) @app.route('/') def index(): return 'flask-session' @app.route('/get/') def get_session(): return session.get('name', '你是誰?') @app.route('/set/') def set_session(): session['name'] = 'houge' return 'session已設定' if __name__ == '__main__': manager.run()
模板引擎
-
說明:
模板檔案就是安裝特定的語法規則書寫的負責展示效果的HTML檔案;模板引擎就是提供這種特定規則替換和解析的工具。
-
Jinja2:
在flask中採用的時Jinja2的模板引擎,它是由flask核心開發組人員開發的。
Jinja2語法
-
目錄結構
project/ # 工程目錄 manage.py # 啟動控制檔案 templates/ # 模板檔案目錄
-
模板渲染
- 在
templates
目錄下建立一個模板檔案index.html
,在其中寫入頁面內容 - 在檢視函式中渲染模板:
render_template('index.html')
- 渲染模板字串:
render_template_string('<h1>渲染模板字串</h1>')
- 設定模板檔案自動載入:
app.config['TEMPLATES_AUTO_RELOAD'] = True
,除錯模式會自動載入
- 在
-
使用變數
- 需要解析的變數需要放在
{{ }}
中 - 渲染模板檔案時需要傳遞相關變數:
render_template('var.html', name='goudan')
- 註釋寫在
{# #}
中
- 需要解析的變數需要放在
-
使用過濾器
- 說明:過濾器就是對要解析的變數進行特定的處理,然後再輸出。
- 使用:
{{ 變數|過濾器 }}
,如:{{ name|upper }}
,就是將name轉換為全大寫輸出 - 常用過濾器:
| 過濾器 | 說明 || ————— | —————————————- || upper | 全大寫 || lower | 全小寫 || title | 每個單詞首字母大寫 || capitalize | 首字母大寫 || trim | 去掉兩邊的空白 || striptags | 過濾HTML標籤 || safe | 渲染時不轉義(預設全部轉義),只能使用在信任的變數渲染 |
- 動態開啟關閉渲染轉義
{# 動態開啟關閉轉義 #} {% autoescape False %} <div>{{ user }}</div> {% endautoescape %}
-
流程控制
{% if name %} <h1>Hello {{ name }}!</h1> {% else %} <h1>Hello World!</h1> {% endif %} <ol> {% for i in range(5) %} <li>{{ i }}</li> {% endfor %} </ol>
-
檔案包含
-
說明:
當有多處相同的顯示效果出現時,將內容單獨提取出來,需要的地方直接包含進來即可。包含另一個檔案,相當將其中的內容直接貼上過來,避免了大量重複書寫(複製貼上)
-
使用:
{% include 'include2.html' %}
-
-
巨集的使用
- 定義巨集:
{% macro 巨集名(引數) %}巨集內容{% endmacro %}
- 呼叫巨集:
{{ 巨集名(引數) }}
- 匯入巨集:
{% from '巨集所在檔案' import 巨集名 %}
- 說明:巨集採用了類似於python中的函式進行定義和呼叫,可以減少程式碼的重複書寫,而且比較靈活。
- 定義巨集:
-
模板繼承
-
說明:當一個網站的多個頁面都很相似,只有細微的差別,可以通過模板繼承減少重複書寫。
-
使用:
parents.html
<html> <head> <meta charset="UTF-8"> <title>{% block title %}基礎模板標題{% endblock %}</title> </head> <body> {% block body %}<div>預設內容</div>{% endblock %} </body> </html>
children.html
{# 繼承自另一個模板 #} {% extends 'parents.html' %} {# 根據block可以修改原有的block內容 #} {% block title %}子模板標題{% endblock %} {% block body %} {# 保留基礎模板中的內容 #} {{ super() }} <div>新加的內容</div> {% endblock %}
-
提醒:若在子模板重寫了一個block,原來的顯示效果全丟了,八成的原因是忘記書寫
{{ super() }}
-