南昌做微信网站,自己做的软件怎么发布,铜梁城乡建设网站,网站建设广告投放是什么Jinjia2 模板
模板的介绍
Jinja2 是一种现代的、设计优雅的模板引擎#xff0c;它是 Python 的一部分#xff0c;由 Armin Ronacher 开发。Jinja2 允许你在 HTML 文档中嵌入 Python 代码#xff0c;以及使用变量、控制结构和过滤器来动态生成内容。它的语法简洁清晰#…Jinjia2 模板
模板的介绍
Jinja2 是一种现代的、设计优雅的模板引擎它是 Python 的一部分由 Armin Ronacher 开发。Jinja2 允许你在 HTML 文档中嵌入 Python 代码以及使用变量、控制结构和过滤器来动态生成内容。它的语法简洁清晰易于学习和使用。
模板的使用
from flask import Flask, render_templateapp Flask(__name__, template_foldercustom_templates) app.route(/)
def index():return render_template(index.html)if __name__ __main__:app.run(debugTrue) template_folder指定模板文件夹 默认是同级目录的 templates 在以上案例下的文件架构如下
project_folder/
│
├── flask_app.py
│
└── custom_templates/│└── index.html模板传递参数
当我们需要通过传递参数来修改模板中的内容时就可以通过模板传参来实现
# app.py
from flask import Flask, render_templateapp Flask(__name__)app.route(/)
def index():# 定义要传递给模板的参数user {username: John, age: 30}fruits [Apple, Banana, Orange, Mango]return render_template(index.html, useruser, fruitsfruits)if __name__ __main__:app.run(debugTrue)
!--index.html--
!DOCTYPE html
html
headtitleFlask Template Example with Parameters/title
/head
bodyh1Hello, {{ user.username }}!/h1pYou are {{ user.age }} years old./ph2Favorite Fruits:/h2ul{% for fruit in fruits %}li{{ fruit }}/li{% endfor %}/ul
/body
/html
显示效果
使用字典传参
对模板传参也支持使用字典的办法
from flask import Flask, render_templateapp Flask(__name__)app.route(/)
def index():# 定义要传递给模板的参数data {user: {username: John, age: 30},fruits: [Apple, Banana, Orange, Mango]}return render_template(index.html, **data) # 这里使用**进行解包这是Python3的特性if __name__ __main__:app.run(debugTrue) 使用**解包传参避免多参数的传参不便 模板中使用url_for函数
# app.py
from flask import Flask, render_template, url_forapp Flask(__name__)app.route(/)
def index():return render_template(index.html)app.route(/hello)
def hello():return Hello, World!if __name__ __main__:app.run(debugTrue)
!--index.html--
!DOCTYPE html
html
headtitleFlask Template Example with url_for()/title
/head
bodyh1Hello, Flask!/h1pThis is a template example./ppa href{{ url_for(hello) }}Say Hello/a/p
/body
/html模板继承
继承允许你创建一个基础模板并在其他模板中扩展它。
!-- base.html --
!DOCTYPE html
html langen
headmeta charsetUTF-8title{% block title %}{% endblock %}/title
/head
body{% block content %}{% endblock %}
/body
/html在父模板中定义 block代表可变对象语法 {% block block_name %} {% endblock %} !-- index.html --
{% extends base.html %}{% block title %}Home{% endblock %}{% block content %}h1Hello, {{ name }}!/h1
{% endblock %}使用 extends 继承模板使用 {% block block_name %}...{% endblock %}即可实现更改内容 include模板导入
在 Jinja2 模板中 include 指令允许你将一个模板导入到另一个模板中。这样可以使模板更具有模块化和可重用性使代码更易于维护和管理。通过 include 指令你可以将一个模板的内容嵌入到另一个模板中的任意位置。
from flask import Flask, render_templateapp Flask(__name__)app.route(/)
def index():return render_template(index.html)if __name__ __main__:app.run(debugTrue)
定义 index.html作为主页
!-- index.html --
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleinclude/title
/head
body
div classcontainer{% include header.html %}h4主题内容/h4{% include footer.html %}
/div
/body
/html
定义 header.html用来显示头部
!-- header.html --
headerh1Header/h1navullia href/Home/a/lilia href/aboutAbout/a/lilia href/contactContact/a/li/ul/nav
/header
定义 footer.html用来显示脚部
!-- footer.html --
footerpcopy; 2024 Flask Template Example. All rights reserved./p
/footer
效果 使用静态资源
在 Web 开发中静态资源如样式表、JavaScript 文件、图像等是构建用户界面和功能的重要组成部分。在 Flask 应用中你可以使用静态资源来美化页面样式、增强交互性并为用户提供更丰富的体验。下面是如何在 Flask 中使用静态资源的简单介绍
组织静态资源文件夹
首先你需要在 Flask 项目中创建一个文件夹来存放静态资源文件通常命名为 static。在这个文件夹中你可以按照你的项目结构组织样式表、JavaScript 文件、图像等静态文件。
your_flask_app/
│
├── static/
│ ├── css/
│ │ └── style.css
│ ├── js/
│ │ └── script.js
│ └── img/
│ └── logo.png
│
├── templates/
│ └── index.html
│
└── app.py使用静态资源
一旦你有了静态资源文件夹你可以在模板中通过使用 url_for 函数来引用这些静态资源。例如在模板中引用样式表文件 style.css
!DOCTYPE html
html langen
headmeta charsetUTF-8titleMy Flask App/titlelink relstylesheet href{{ url_for(static, filenamecss/style.css) }}
/head
bodyh1Welcome to My Flask App/h1img src{{ url_for(static, filenameimg/logo.png) }} altLogoscript src{{ url_for(static, filenamejs/script.js) }}/script
/body
/html在这个示例中url_for(static, filenamepath/to/resource) 函数用于生成静态资源的 URL。在调用时第一个参数 static 是 Flask 中默认用于静态资源的端点而第二个参数 filename 是静态资源的路径。
设置静态文件夹地址
from flask import Flask, render_templateapp Flask(__name__, static_folderstatic2) # 设置静态文件夹地址为 static2
# 第二种方式 app.static_folder static2app.route(/)
def index():return render_template(index.html)if __name__ __main__:app.run(debugTrue) Jinjia2 语法
Jinja2 是一种现代的、设计优雅的模板引擎它为开发者提供了一种简单而强大的方式来创建动态内容。Jinja2 的语法清晰简洁易于学习和使用。在这里我将详细介绍 Jinja2 的主要语法元素
定义变量
!-- index.html --
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleFlask Template Example/title
/head
body{% set title Title %}{% with subtitlesubtitle %}{% set combined_title title subtitle %}h1{{ combined_title }}/h1{% with paragraphThis is the paragraph content of my website. %}p{{ paragraph }}/p{% endwith %}{% endwith %}!-- 此处出了with的范围则不可使用其中变量subtitle等 --
/body
/html with只在范围内可用 set则是全局 with和 set可以结合使用 插入变量
在 Jinja2 中你可以使用双大括号 {{ ... }} 来插入变量。这些变量将在渲染模板时替换为实际的值。
pHello, {{ name }}!/p流程控制
Jinja2 支持常见的控制结构如条件语句和循环。控制结构使用 {% ... %} 包裹。
条件语句
# app.py
from flask import Flask, render_templateapp Flask(__name__)app.route(/)
def index():# 假设这是从后端传递给前端的数据user {username: Alice, age: 30}return render_template(index.html, useruser)if __name__ __main__:app.run(debugTrue)
!--index.html--
!DOCTYPE html
html
headtitle选择结构示例/title
/head
bodyh1欢迎访问我的网站/h1p用户信息/pulli用户名{{ user.username }}/lili年龄{{ user.age }}/li/ul{% if user.age 18 %}p您未满18岁属于未成年人。/p{% elif user.age 18 and user.age 60 %}p您已满18岁属于成年人。/p{% else %}p您已年满60岁属于老年人。/p{% endif %}
/body
/html
效果 循环
from flask import Flask, render_templateapp Flask(__name__)# 假设这是你的数据
items {Apple: Red,Banana: Yellow,Orange: Orange,Grapes: Purple
}app.route(/)
def index():return render_template(index.html, itemsitems)if __name__ __main__:app.run(debugTrue)
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleFlask Jinja2 Example/title
/head
bodyh1Fruit Colors/h1ul{% for fruit, color in items.items() %}li{{ fruit }}: {{ color }}/li{% endfor %}/ul
/body
/html
效果 注释
你可以在模板中使用 {#...#}添加注释这些注释不会在最终渲染的输出中显示。
{# This is a comment #}过滤器
过滤器允许你在输出中应用转换。它们以管道符 | 的形式使用。 官方使用文档 p{{ sentence|capitalize }}/p过滤器描述示例用法capitalize将变量的首字母转换为大写。{{ variable_name|capitalize }}lower将变量转换为小写。{{ variable_name|lower }}upper将变量转换为大写。{{ variable_name|upper }}title将每个单词的首字母转换为大写。{{ variable_name|title }}trim移除变量的首尾空格。{{ variable_name|trim }}escape将 HTML 转义为安全的字符串。{{ variable_name|escape }}safe标记变量为安全告诉模板引擎不要转义该变量。{{ variable_name|safe }}length返回变量的长度。{{ variable_name|length }}default如果变量为 False、None 或空使用默认值。 {{variable_name|default(default_value,booleanTrue)}}简单办法 {{ variable_name or default_value }}urlencode对 URL 进行编码。{{ variable_name|urlencode }}join使用指定字符将列表中的元素连接起来。{{ list_variable|join(, ) }}slice从列表中取出一部分元素。{{ list_variable|slice(start, stop) }}sort对列表进行排序。{{ list_variable|sort }}reverse将列表倒序。{{ list_variable|reverse }}dictsort对字典按键或值进行排序。{{ dict_variable|dictsort(attributekey) }}abs返回变量的绝对值。{{ variable_name|abs }}round四舍五入到指定的小数位数。{{ variable_name|round(precision2) }}striptags删除字符串中所有的HTML标签如果出现多个空格将替换成一个空格{{ variable_name|striptags }}replace字符串替换 {{ text |replace(old, new) }}
自定义过滤器
# app.py
from flask import Flask, render_templateapp Flask(__name__)# app.template_filter(reverse) # 注册自定义过滤器
def reverse_filter(s): # 自定义过滤器函数return s[::-1]app.jinja_env.filters[reverse] reverse_filter # 注册自定义过滤器的第二种方法# 路由
app.route(/)
def index():# 在模板中使用自定义过滤器message Hello, World!return render_template(index.html, messagemessage)if __name__ __main__:app.run(debugTrue) 使用装饰器或者 app.jinja_env.filters都可以设置过滤器 !--index.html--
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleCustom Filter Example/title
/head
body
porigin message: {{ message }}/p
pReversed message: {{ message | reverse }}/p
/body
/html 定义宏
宏类似于函数允许你定义可重用的代码块。
宏没有返回值
在Python文件中定义宏
from flask import Flask, render_templateapp Flask(__name__)# 定义一个简单的宏用于在模板中显示消息
app.template_global()
def display_message(message):return fMessage: {message}app.route(/)
def index():return render_template(index.html, messageHello, world!)if __name__ __main__:app.run(debugTrue) 在 py文件中直接定义了宏方法可在 html文件中直接使用 !DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleFlask Template Example/title
/head
body!-- 使用宏显示消息 --{{ display_message(message) }}
/body
/html
在html文件中定义宏
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titleFlask Template Example/title
/head
body!-- 定义宏 --{% macro display_message(message) %}pMessage: {{ message }}/p{% endmacro %}!-- 使用宏 --{{ display_message(Hello, world!) }}
/body
/html
效果
宏文件引用
from flask import Flask, render_templateapp Flask(__name__)app.route(/)
def index():return render_template(index.html, messageHello, world!)if __name__ __main__:app.run(debugTrue)
!-- 引入宏文件并传递变量 --
{% import macros/macros.html as macros with context %}
!--引入宏而不传递变量--
{% import macros/macros.html as macros %}!-- 另一种引入方式 --
{% from macros/macros.html import display %}!-- 使用宏并传参 --
{{ macros.display_message(message) }}
!-- 使用宏 --
{{ display() }}在引入宏的时候可以使用 with context来共享变量意思是此时的宏中能直接使用当前环境下有的变量。 注意文件架构
project_folder/
│
├── flask_app.py
│
└── macros/│└── macros.html!-- macros.html --
{% macro display_message(content) %}
pContent: {{ content }}/p
{% endmacro %}{% macro display(content) %}
pContent: {{ message }}/p
{% endmacro %}变量过滤器
Jinja2 提供了一些内置的变量过滤器用于对变量进行处理例如格式化日期、字符串截断等。
{{ user.created_at|date(Y-m-d) }}转义
在插入变量时默认情况下 Jinja2 会自动转义 HTML 字符以防止 XSS 攻击。但是你也可以使用 safe 过滤器来禁用转义。
{{ unsafe_html|safe }}过滤器链
你可以将多个过滤器串联在一起以便在一个变量上应用多个转换。
{{ sentence|capitalize|truncate(50) }}