Flask(四) 模板渲染render_template

文章目錄

  • 📦 過程詳解(路由 <-> HTML 模板)
    • 🧠 數據是怎么傳過去的?
    • 多變量示例
  • ? Jinja2 支持條件判斷、循環、模板繼承:
  • ? 安全性
    • 🔒 Flask 默認也會對變量進行 HTML 轉義:
    • 📍 {{ chart | safe }}
      • 在 pyecharts 中怎么用?
  • 📦模板繼承
    • 🧱 文件結構示例
      • base.html(母板模板)
      • index.html(子模板)
      • login.html(子模板)
  • 📦過濾器
  • 📦宏和模板包含
  • 📦 Flask-Login 登錄系統
    • 1、安裝 Flask-Login:
    • 2、初始化 LoginManager
    • 3、用戶模型實現:
    • 4、登錄與登出視圖示例:
    • 5、當前登錄的用戶
      • 含義解釋
    • 其他常用方法

Flask 使用 Jinja2 模板引擎來處理模板渲染。模板渲染允許你將動態內容插入到 HTML 頁面中,使得應用能夠生成動態的網頁內容。

  • 創建模板:將 HTML 文件放在 templates 文件夾中,使用 Jinja2 占位符。
  • 渲染模板:使用 render_template 函數在視圖函數中渲染模板。
  • 模板繼承:創建基礎模板,允許其他模板繼承和擴展。
  • 控制結構:使用條件語句和循環在模板中控制邏輯。
  • 過濾器:使用過濾器格式化變量數據。
  • 宏和模板包含:創建和使用宏以及模板包含,提高模板的復用性。
  • 安全性:Jinja2 默認對模板變量進行自動轉義以防止 XSS 攻擊。
  • 模板上下文:將數據傳遞給模板,并在模板中使用這些數據。

📦 過程詳解(路由 <-> HTML 模板)

瀏覽器請求:GET /hello↓
Flask 匹配 @app.route('/hello') → 調用 hello() 函數↓
hello() 中使用 render_template() 渲染 hello.html↓
將 name="張三" 傳入模板引擎 Jinja2↓
Jinja2 渲染出 HTML: <h1>你好, 張三!</h1>↓
Flask 把 HTML 打包成 Response 對象返回瀏覽器↓
瀏覽器顯示頁面

🧠 數據是怎么傳過去的?

render_template("模板名.html", 變量名1=1, 變量名2=2, ...)

模板中用 {{ 變量名 }} 就能訪問到。

多變量示例

@app.route('/dashboard')
def dashboard():stats = {"pv": 1000, "uv": 300}return render_template('dashboard.html', stats=stats, username="admin")

templates/dashboard.html

<h2>歡迎, {{ username }}</h2>
<p>頁面瀏覽量:{{ stats.pv }}</p>
<p>獨立訪客數:{{ stats.uv }}</p>

? Jinja2 支持條件判斷、循環、模板繼承:

{% if user %}<p>歡迎 {{ user }}!</p>
{% else %}<p>請先登錄</p>
{% endif %}

{% if user %}:檢查 user 變量是否存在,如果存在,則顯示歡迎消息,否則顯示登錄提示。

循環語句:

<ul>
{% for item in items %}<li>{{ item }}</li>
{% endfor %}
</ul>

{% for item in items %}:遍歷 items 列表,并為每個項生成一個 <li> 元素。

? 安全性

自動轉義:Jinja2 默認會對模板中的變量進行自動轉義,防止 XSS 攻擊。
{{ user_input }}:用戶輸入的內容會被自動轉義,以避免惡意腳本的注入。

🔒 Flask 默認也會對變量進行 HTML 轉義:

比如

chart = "<script>alert('Hi')</script>"

在模版中寫

{{ chart }}

瀏覽器會看到:

&lt;script&gt;alert('Hi')&lt;/script&gt;

因為 Flask 模板會自動進行 HTML 安全轉義。

📍 {{ chart | safe }}

{{ chart | safe }} 是 Flask 模板中一個非常常見的寫法,特別用于像 pyecharts、plotly 等圖表庫,把圖表插入 HTML 頁面的關鍵語句。
{{ chart | safe }} 意思是把 chart 的內容作為 HTML 原樣輸出(不再自動轉義)

在 pyecharts 中怎么用?

pyecharts 生成的圖表是一個 HTML

from pyecharts.charts import Bar
from pyecharts import options as optsbar = (Bar().add_xaxis(["A", "B", "C"]).add_yaxis("銷量", [10, 20, 30])
)
chart = bar.render_embed()

在 Flask 中渲染:

return render_template("chart.html", chart=chart)

模板中這樣寫:

<div>{{ chart | safe }}
</div>

這樣圖表就會在頁面中正常顯示!

請不要對用戶輸入的數據使用 | safe,除非你已經對內容做過嚴格校驗,否則可能產生 XSS 攻擊漏洞。

📦模板繼承

模板繼承允許你創建一個基礎模板,然后在其他模板中繼承和擴展這個基礎模板,避免重復的 HTML 代碼。

創建基礎模板:在 templates 文件夾中創建一個基礎模板 base.html。

templates/base.html 示例:

<!DOCTYPE html>
<html>
<head><title>{% block title %}My Website{% endblock %}</title>
</head>
<body><header><h1>My Website</h1></header><main>{% block content %}{% endblock %}</main><footer><p>Footer content</p></footer>
</body>
</html>

{% block title %} {% endblock %} {% block content %} {% endblock %} 是定義的可替換區域。
創建子模板:在 templates 文件夾中創建一個子模板 index.html,繼承 base.html。

templates/index.html 文件代碼:

{% extends "base.html" %}{% block title %}Home Page{% endblock %}{% block content %}
<h2>Welcome to the Home Page!</h2>
<p>Content goes here.</p>
{% endblock %}

{% extends "base.html" %}:繼承基礎模板。

{% block title %} {% block content %}:重寫基礎模板中的塊內容。

🧱 文件結構示例

templates/
├── base.html        ← 通用母版模板
├── index.html       ← 首頁(繼承 base)
└── login.html       ← 登錄頁(繼承 base

base.html(母板模板)

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>{% block title %}默認標題{% endblock %}</title><link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
</head>
<body><header><h1>我的網站</h1><nav><a href="{{ url_for('index') }}">首頁</a> |<a href="{{ url_for('login') }}">登錄</a></nav></header><main>{% block content %}{% endblock %}</main><footer><p>版權所有 ? 2025</p></footer>
</body>
</html>

index.html(子模板)

{% extends "base.html" %}{% block title %}首頁{% endblock %}{% block content %}
<h2>歡迎訪問首頁</h2>
<p>這里是首頁內容</p>
{% endblock %}

login.html(子模板)

{% extends "base.html" %}{% block title %}登錄{% endblock %}{% block content %}
<h2>登錄頁面</h2>
<form method="post">用戶名: <input name="username"><br>密碼: <input name="password" type="password"><br><button type="submit">登錄</button>
</form>
{% endblock %}

📦過濾器

過濾器用于在模板中格式化和處理變量數據。

<p>{{ name|capitalize }}</p>
<p>{{ price|round(2) }}</p>

{{ name|capitalize }}:將 name 變量的值首字母大寫。
{{ price|round(2) }}:將 price 變量的值四舍五入到小數點后兩位。

📦宏和模板包含

宏是可重用的模板片段。模板包含允許你在一個模板中插入另一個模板的內容。
創建宏

templates/macros.html 代碼文件:
實例
{% macro render_item(item) %}<div><h3>{{ item.title }}</h3><p>{{ item.description }}</p></div>
{% endmacro %}

使用宏:

templates/index.html 文件代碼:
實例

{% from "macros.html" import render_item %}<h1>Items</h1>
{% for item in items %}{{ render_item(item) }}
{% endfor %}

{% from "macros.html" import render_item %}:導入宏。
{{ render_item(item) }}:調用宏來渲染每個 item。

📦 Flask-Login 登錄系統

1、安裝 Flask-Login:

pip install flask-login

2、初始化 LoginManager

from flask_login import LoginManagerlogin_manager = LoginManager()
login_manager.init_app(app)@login_manager.user_loader
def load_user(user_id):return User.query.get(user_id)

3、用戶模型實現:

from flask_login import UserMixinclass User(db.Model, UserMixin):id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(64), unique=True, nullable=False)# 其他字段...

UserMixin 提供 is_authenticated、is_active、get_id() 等屬性
UserMixin 添加到你的用戶模型中后,它會自動為你提供實現 Flask-Login 所要求的接口。

4、登錄與登出視圖示例:

from flask_login import login_user, logout_user@app.route('/login', methods=['GET', 'POST'])
def login():user = User.query.filter_by(username="admin").first()login_user(user)  # 登錄return redirect(url_for('index'))@app.route('/logout')
def logout():logout_user()return redirect(url_for('index'))

5、當前登錄的用戶

from flask_login import current_user
<body>{% if current_user.is_authenticated %}<p>歡迎,{{ current_user.username }}!</p><a href="{{ url_for('logout') }}">登出</a>{% else %}<p>您尚未登錄。</p><a href="{{ url_for('login') }}">登錄</a>{% endif %}
</body>

含義解釋

{% if current_user.is_authenticated %}:在使用 Flask-Login 時,current_user 是 Flask 提供的一個全局代理對象,代表當前登錄的用戶。
current_user.is_authenticated 是一個布爾值:

  • True:用戶已登錄
  • False:用戶未登錄(匿名)

其他常用方法

代碼說明
current_user.is_authenticated判斷當前用戶是否登錄
current_user.username訪問當前登錄用戶屬性
UserMixin提供用戶模型默認認證屬性

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89109.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89109.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89109.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[附源碼+數據庫+畢業論文+開題報告]基于Spring+MyBatis+MySQL+Maven+jsp實現的寵物領養管理系統,推薦!

摘 要 互聯網發展至今&#xff0c;無論是其理論還是技術都已經成熟&#xff0c;而且它廣泛參與在社會中的方方面面。它讓信息都可以通過網絡傳播&#xff0c;搭配信息管理工具可以很好地為人們提供服務。針對寵物領養信息管理混亂&#xff0c;出錯率高&#xff0c;信息安全性差…

【ArcGIS】水資源單項評價

【ArcGIS】水資源單項評價 一、水資源單項評價1、評價思路 二、操作步驟1、處理環境設置2、數據處理3、要素轉柵格4、水資源評價 一、水資源單項評價 1、評價思路 &#xff08;1&#xff09;省級層面宜選用四級/五級水資源分區或縣級行政區為評價單元&#xff0c;按照水資源總…

Windows環境下C語言匯編語言編輯器及環境安裝

安裝MinGw&#xff1a; 1.下載安裝文件 MinGW - 適用于 Windows 的極簡主義 GNU 下載 |SourceForge.net 點擊下載 下載之后就是如下圖的安裝文件 2.安裝 雙擊安裝文件進行安裝&#xff0c;點擊Install下一步 選擇安裝位置&#xff0c;默認是安裝在C盤&#xff0c;點擊Change…

【數據分析】分段邏輯回歸示例分析(模擬數據)

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹加載R包步驟 1:模擬數據步驟 2:構建邏輯回歸和分段模型步驟 3:計算預測值和置信區間步驟 4:提取 OR 和統計值步驟 5:繪圖展示結步驟 6:輸出圖片原始代碼總結系統信息參考介紹…

Webpack 構建過程詳解

Webpack 是一個功能強大的模塊打包工具,它能夠將項目中的各種資源(如 JavaScript、CSS、圖片等)打包成一個或多個文件,以便于在瀏覽器中運行。本文將以 Webpack 5 為例介紹它的構建過程: 1. 初始化階段 在這個階段,Webpack 從配置文件和命令行參數中讀取并解析配置。然…

Flutter基礎(UI監聽)

文本按鈕&#xff08;TextButton&#xff09; 文本按鈕是沒有邊框的按鈕&#xff0c;當點擊時會有漣漪效果。 TextButton(onPressed: () {// 點擊按鈕后要執行的代碼print(文本按鈕被點擊了);},child: Text(點擊我), ) 手勢檢測器&#xff08;GestureDetector&#xff09; …

Linux 下的 regulator 子系統

1、簡介 regulator 框架是 Linux 內核中用于管理電壓和電流調節器&#xff08;如 LDO、DCDC 轉換器等&#xff09;的一個子系統。它提供了一個抽象層&#xff0c;使得驅動程序和內核的其他部分可以以一致的方式與調節器進行交互&#xff0c;而無需了解底層硬件的細節。 主要功能…

12345政務熱線系統:接訴即辦,賦能智慧城市治理

一、12345熱線&#xff1a;民情直通車&#xff0c;治理新引擎 “12345”政務熱線是黨委政府了解社情民意、解決群眾合理訴求、傾聽批評建議、改進工作作風的重要渠道。當前&#xff0c;全國各城市已基本建成12345政務服務熱線體系&#xff0c;形成“接訴即辦”的高效響應機制。…

【SpringBoot核心】Spring Boot + MyBatis 深度整合與最佳實踐

目錄 引言Spring Boot 基礎回顧MyBatis 核心概念解析Spring Boot 整合 MyBatisMyBatis 高級特性Spring Boot + MyBatis 最佳實踐性能優化與擴展實戰案例:電商系統開發常見問題與解決方案總結與展望1. 引言 1.1 技術背景與現狀 在現代企業級應用開發中,數據持久化是一個核心…

力扣第77題-組合-力扣第78題-子集

力扣鏈接:77. 組合 - 力扣&#xff08;LeetCode&#xff09; 給定兩個整數 n 和 k&#xff0c;返回范圍 [1, n] 中所有可能的 k 個數的組合。 你可以按 任何順序 返回答案。 示例 1&#xff1a; 輸入&#xff1a;n 4, k 2 輸出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3…

嵌入式MTD設備與Flash管理解析

理解MTD是嵌入式系統中處理Flash存儲的關鍵一步&#xff01;我來幫你梳理清楚&#xff1a; MTD 是什么&#xff1f; MTD 是 Memory Technology Device 的縮寫&#xff0c;中文常譯為內存技術設備。它是 Linux 內核及其衍生系統&#xff08;如嵌入式 Linux&#xff09;中用于管…

基于 GEE 利用 Sentinel-2 數據計算并下載植被指數數據

目錄 1 植被指數 2 完整代碼 3 運行結果 1 植被指數 植被指數全名NDVI歸一化差值植被指數GNDVI綠色歸一化差值植被指數EVI增強植被指數EVI2雙波段增強植被指數DVI差值植被指數GDVI綠色差植被值指數RVI比值植被指數SAVI土壤調整植被指數OSAVI優化土壤調整植被指數MSAVI修改…

python基礎23(2025.6.29)分布式爬蟲(增量式爬蟲去重)redis應用_(未完成!)

本次寫一個爬取網易新聞的案例。因為redis能處理高并發&#xff0c;存儲數據也可以&#xff0c;故不用mysql。而且新聞網站容易更新很多&#xff0c;而mysql只能持久化存儲。 import scrapy import re import json import redis # 用它來去除重復, 記錄訪問過的urlclass Wang…

Springboot 集成 SpringState 狀態機

Springboot 集成 SpringState 狀態機 1.SpringState 簡介2.狀態機示例2.1 項目結構和依賴包2.2 定義事件類和狀態類2.3 Spring 事件監聽器2.4 狀態機持久化類2.4.1 Redis 狀態機持久化容器2.4.2 Redis 配置2.4.3 狀態機監聽器 2.5 裝機器容器2.6 狀態機事件發送器2.7 狀態機配置…

實戰四:基于PyTorch實現貓狗分類的web應用【2/3】

?一、需求描述 實戰四分為三部分來實現&#xff0c;第二部分是基于PyTorch的貓狗圖像可視化訓練的教程&#xff0c;實現了一個完整的貓狗分類模型訓練流程&#xff0c;使用預訓練的ResNet50模型進行遷移學習&#xff0c;并通過SwanLab進行實驗跟蹤。 效果圖 ?二、實現思路 …

對比幾個測試云的一些速度

最近被hosting vps主機的速度給困擾了&#xff0c;干脆放下手中的活 測試下 test.php放在網站根目錄即可 代碼如下&#xff1a; <?php /*** 最終版服務器性能測試工具* 測試項目&#xff1a;CPU運算性能、內存讀寫速度、硬盤IO速度、網絡下載速度*/// 配置參數&#xff…

UE5 Grid3D 學習筆記

一、Neighbor Grid 3D 的核心作用 NeighborGrid3D 是一種基于位置的哈希查找結構&#xff0c;將粒子按空間位置劃分到網格單元&#xff08;Cell&#xff09;中&#xff0c;實現快速鄰近查詢&#xff1a; 空間劃分&#xff1a;將模擬空間劃分為多個三維網格單元&#xff08;Cel…

Spring AI ——在springboot應用中實現基本聊天功能

文章目錄 前言測試環境項目構建依賴引入指定openai 相關配置基于 application.yml 配置 Open AI 屬性application.yml編寫測試類測試請求基于讀取后配置請求編寫測試接口測試效果展示流式輸出前言 AI 技術越來越火爆,作為Java開發人員也不能拖了后腿。 前段時間使用LangChain…

條件概率:不確定性決策的基石

條件概率是概率論中的核心概念&#xff0c;用于描述在已知某一事件發生的條件下&#xff0c;另一事件發生的概率。它量化了事件之間的關聯性&#xff0c;是貝葉斯推理、統計建模和機器學習的基礎。 本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術…

搭建Flink分布式集群

1. 基礎環境&#xff1a; 1.1 安裝JDK 本次使用 jdk-11.0.26_linux-x64_bin.tar.gz 解壓縮 tar -zxvf jdk-11.0.26_linux-x64_bin.tar.gz -C /usr/local/java/ 配置環境變量&#xff1a; vi /etc/profileJAVA_HOME/usr/local/java/jdk-11.0.26 CLASSPATH.:${JAVA_HOME}/li…