Flask學習筆記 - 模板渲染

Flask 模板渲染

模板是包含占位符的 HTML 文件

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

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

基本概念/創建模板

模板是包含占位符的 HTML 文件。

Flask 使用 Jinja2 模板引擎來渲染這些模板,將 Python 數據插入到 HTML 中,從而生成最終的網頁。

<!DOCTYPE html>
<html>
<head><title>Welcome</title>
</head>
<body><h1>{{ title }}</h1><p>Hello, {{ name }}!</p>
</body>
</html>

app.py

from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def index():return render_template('index.html',title='Home',name='Misha')if __name__ == '__main__':app.run(debug=True)

格式: {{ 變量名 }}

01.png

模板繼承

root.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>

leaf.html

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

app.py

@app.route('/leaf')
def leaf():return render_template('leaf.html')

檢查響應的內容確實被替換了

02.png

格式:可替換區域 {% block 變量名 %} {% endblock %}

控制結構

Jinja2 提供了多種控制結構,用于在模板中實現條件邏輯和循環。

ctrl_flow.html

<!DOCTYPE html>
<html>
<head><title>Welcome</title>
</head>
<body><!-- 條件語句 -->{% if user %}<p>Welcome, {{ user }}!</p>{% else %}<p>Please log in.</p>{% endif %}<!-- 循環語句 --><ul>{% for item in items %}<li>{{ item }}</li>{% endfor %}</ul>
</body>
</html>

app.py

@app.route('/ctrl_flow')
def ctrl_flow():# return render_template('ctrl_flow.html',user="Zhangsan")# return render_template('ctrl_flow.html')return render_template('ctrl_flow.html',user="Zhangsan",items=['apple','banana','orange'])

傳了user
03.png

未傳user和items
04.png

傳了user和items
05.png

過濾器

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

filter.html

<!DOCTYPE html>
<html>
<head><title>Welcome</title>
</head>
<body>
<p>{{ name|capitalize }}</p>
<p>{{ price|round(2) }}</p>
</body>
</html>

app.py

@app.route('/filter')
def filter():return render_template('filter.html',name='wangwu',price=2.999)

過濾器的寫法與shell中的管道一樣都是用"|"來表示

格式: {{ 變量名|處理方法 }}

06.png

宏和模板包含

macros.html

{% macro render_item(item) %}<div><h3>{{ item.title }}</h3><p>{{ item.description }}</p></div>
{% endmacro %}

使用宏: macros_demo.html

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

app.py

@app.route('/macros')
def macros():# return render_template('macros_demo.html',items=['apple','banana','orange'])return render_template('macros_demo.html',items=[{"title":"apple","description":"蘋果"},{"title":"banana","description":"香蕉"},{"title":"orange","description":"橘子"}])

變量不正確時的效果

07_1.png

正常的顯示

07_2.png

安全性

security.html

<html>
<head> security </head>
<body>
<p>{{ user_input }}</p>
</body>
</html>
@app.route('/xss')
def xss():return render_template('security.html',user_input='<script> alert(1) </script>')

自動轉義:Jinja2 默認會對模板中的變量進行自動轉義,防止 XSS 攻擊。

<script>標簽不會被認為是html元素

08.png

模板上下文

視圖函數中傳遞的變量成為模板的上下文,這些變量可以在模板中直接使用。

profile.html

<h1>{{ user.name }}</h1>
<p>Age: {{ user.age }}</p>

app.py

@app.route('/profile/<username>')
def profile(username):user = {'name': username, 'age': 25}return render_template('profile.html', user=user)

09.png

Demo

Flask

參考

  1. Flask模板渲染

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

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

相關文章

解碼 from XXX import * - 導入的真相

文章目錄 前言一、 什么是 from XXX import *?二、基本用法:導入的實際效果三、默認行為:無 __all__ 的情況四、與直接運行 XXX.py 的對比示例模塊使用 from XXX import *直接運行 python example.py關鍵差異五、為什么需要注意 from XXX import *?最佳實踐六、實際應用場景…

JavaScript 中常見的鼠標事件及應用

JavaScript 中常見的鼠標事件及應用 在 JavaScript 中&#xff0c;鼠標事件是用戶與網頁進行交互的重要方式&#xff0c;通過監聽這些事件&#xff0c;開發者可以實現各種交互效果&#xff0c;如點擊、懸停、拖動等。 在 JavaScript 中&#xff0c;鼠標事件類型多樣&#xff0…

Nacos注冊中心AP模式核心源碼分析(單機模式)

文章目錄 概述一、客戶端啟動主線流程源碼分析1.1、客戶端與Spring Boot整合1.2、注冊實例&#xff08;服務注冊&#xff09;1.3、發送心跳1.4、拉取服務端實例列表&#xff08;服務發現&#xff09; 二、服務端接收請求主線流程源碼分析2.1、接收注冊請求2.1.1、初始化注冊表2…

prism WPF 模塊

模塊 DLL ModuleA 和 ModuleB 都要安裝 Prism.Unity 引用方式1 項目引用 直接 在引用中添加項目引用 App.xaml.cs 添加模塊 ConfigureModuleCatalog using ModuleA; using ModuleB; using Prism.Ioc; using Prism.Modularity; using Prism.Unity; using PrismWpfApp.ViewMo…

CSS:換行與不換行

一、CSS 不允許換行 在 CSS 中&#xff0c;有幾種方法可以控制文本不換行&#xff1a; 1. 使用 white-space 屬性 .no-wrap {white-space: nowrap; } white-space: nowrap; 會強制文本在一行顯示&#xff0c;不換行。 2. 使用 overflow 和 text-overflow 通常與 white-sp…

JavaScript BOM、事件循環

目錄 BOM&#xff08;瀏覽器對象模型&#xff09; 一、window 對象 1. 窗口控制 2. 定時器 二、location 對象 三、navigator 對象 四、history 對象 五、screen 對象 六、本地存儲 1. localStorage 2. sessionStorage 七、BOM 應用場景 八、總結 JavaScript 執行…

k8s運維面試總結(持續更新)

一、你使用的promethues監控pod的哪些指標&#xff1f; CPU使用率 內存使用率 網絡吞吐量 磁盤I/O 資源限制和配額&#xff1a;Prometheus可以監控Pod的資源請求和限制&#xff0c;確保它們符合預設的配額&#xff0c;防止資源過度使用。具體指標如container_spec_cpu_quota用于…

ubuntu20.04升級成ubuntu22.04

命令行 sudo do-release-upgrade 我是按提示輸入y確認操作&#xff0c;也可以遇到配置文件沖突時建議選擇N保留當前配置

Cortex-M? 函數調用的入棧與出棧操作

在 ARM Cortex-M 系列單片機中,普通C函數調用的入棧(壓棧)和出棧操作通常由編譯器編譯后生成的代碼管理,而硬件僅負責部分關鍵操作。以下是詳細分析: 1. 函數調用與返回的核心機制 (1) 硬件自動完成的部分 返回地址的保存: 當通過 BL(Branch with Link)或 BLX 指令調用…

DeepSeek能否用于對話系統(Chatbot)?技術解析與應用實例!

引言&#xff1a;Chatbot 的進化與挑戰 你有沒有發現&#xff0c;現在的AI聊天機器人越來越聰明了&#xff1f;無論是客服助手、智能語音設備&#xff0c;還是社交媒體上的自動回復&#xff0c;Chatbot&#xff08;對話系統&#xff09;已經滲透到我們生活的方方面面。但問題是…

多表查詢的多與一

1.查尋表需要的條件 1.1.首先我們要了解查詢表有哪些 1.1.1.多對一 多對一就是一個年表擁有例外一個表的多條數據 一個表對應立一個表的多條數據&#xff0c;另一個表對應這個表的多條數據 這個點被稱為多對一 1.1.2.多對多 多對多簡單來說就是需要一個中間商 中間商就…

配置文件、Spring日志

SpringBoot配置?件 SpringBoot?持并定義了配置?件的格式, 也在另?個層?達到了規范其他框架集成到SpringBoot的 ?的. 很多項?或者框架的配置信息也放在配置?件 中, ?如: 項?的啟動端? 數據庫的連接信息(包含??名和密碼的設置) 第三?系統的調?密鑰等信息 ?…

嵌入式——Linux系統的使用以及編程練習

目錄 一、Linux的進程、線程概念 &#xff08;一&#xff09;命令控制進程 1、命令查看各進程的編號pid 2、命令終止一個進程pid 二、初識Linux系統的虛擬機內存管理 &#xff08;一&#xff09;虛擬機內存管理 &#xff08;二&#xff09;與STM32內存管理對比 三、Lin…

Springcache+xxljob實現定時刷新緩存

目錄 SpringCache詳解 SpringCache概述 核心原理 接口抽象與多態 AOP動態代理 核心注解以及使用 公共屬性 cacheNames KeyGenerator&#xff1a;key生成器 key condition&#xff1a;緩存的條件&#xff0c;對入參進行判斷 注解 xxl-job詳解 SpringcacheRedis實現…

前端Uniapp接入UviewPlus詳細教程!!!

相信大家在引入UviewPlusUI時遇到很頭疼的問題&#xff0c;那就是明明自己是按照官網教程一步一步的走&#xff0c;為什么到處都是bug呢&#xff1f;今天我一定要把這個讓人頭疼的問題解決了&#xff01; 1.查看插件市場 重點&#xff1a; 我們打開Dcloud插件市場搜素uviewPl…

vector的介紹與代碼演示

由于以后我們寫OJ題時會經常使用到vector&#xff0c;所以我們必不可缺的是熟悉它的各個接口。來為我們未來作鋪墊。 首先&#xff0c;我們了解一下&#xff1a; https://cplusplus.com/reference/vector/ vector的概念&#xff1a; 1. vector是表示可變大小數組的序列容器…

ZLMediaKit 源碼分析——[5] ZLToolKit 中EventPoller之延時任務處理

系列文章目錄 第一篇 基于SRS 的 WebRTC 環境搭建 第二篇 基于SRS 實現RTSP接入與WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 環境搭建 第四篇 WebRTC學習一&#xff1a;獲取音頻和視頻設備 第五篇 WebRTC學習二&#xff1a;WebRTC音視頻數據采集 第六篇 WebRTC學習三…

【零基礎入門unity游戲開發——2D篇】SortingGroup(排序分組)組件

考慮到每個人基礎可能不一樣&#xff0c;且并不是所有人都有同時做2D、3D開發的需求&#xff0c;所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要講解C#的基礎語法&#xff0c;包括變量、數據類型、運算符、…

26信號和槽_自定義信號(1)

Qt 中也允許自定義信號 ①自定義槽函數,非常關鍵.開發中大部分情況都是需要自定義槽函數的. 槽函數&#xff0c;就是用戶觸發某個操作之后,要進行的業務邏輯. ②自定義信號,比較少見.實際開發中很少會需要自定義信號. 信號就對應到用戶的某個操作~ 在 GUI,用戶能夠進行哪些操作…

今天來介紹一下一個簡單,靈活的JavaScrip圖標工具Chart.js

Chart.js 柱形圖 先看效果&#xff1a; 代碼部分&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title></title> <script src"https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/Chart.js/3.7…