Flask 轻量级 Python 框架:JinJa2 语法介绍和示例解释
1. 概述
Flask 是一个支持 JinJa2 模板引擎的轻量级 Python Web 框架。 Jinja2 是一种流行的 Python 模板工具,可用于使用 Flask 构建动态 Web 应用程序。
网站一般需要html、css和js。刚开始学习python web时,可以这样写:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return '<h1>hello</h1><p style="color:red">hello world!!!</p>'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
上面的代码虽然也能运行,但是不太漂亮。现在的编程基本上是前端和后端分离。客户端代码不会被注入到代理服务器中。为了实现前后端分离,采用MVT设计方案:
M
写为Model
,与MVC中的M功能相同,为负责与数据库交互和数据处理。V
写作View
。它与MVC中的C的功能相同。它接收请求、执行业务处理并返回响应。T
写为Template
,与MVC中的V功能相同,负责封装和构建要返回的html。 ? 。在 Flask 中,您可以通过将变量传递给模板来显示变量。示例代码如下:# variable.py # Flask中将变量传递给模板 from flask import Flask, render_template app = Flask(__name__) # 也可指定模板目录 # app = Flask(__name__, template_folder="/opt/python-projects/flask") @app.route('/') def hello(): name = "Alice" return render_template('variable.html', name=name) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
在上面的代码中,变量
name
被传递给模板hello.html
。<!-- templates/variable.html模板 --> <!DOCTYPE html> <html> <head> <title>variable</title> </head> <body> <h1>hello {{ name }}!</h1> </body> </html>
执行
python3 variable.py
访问
curl http://192.168.182.110:8000/
2)控制结构
在Jinja 2中,您可以使用
if,和
等命令控制输出模板。示例代码如下:
# if.py # Flask中使用if控制结构 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): user = {"name": "Alice", "age": 25} return render_template('if.html', user=user) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
templates/if.html
模板文件<!-- if.html模板 --> <!DOCTYPE html> <html> <head> <title>Hello</title> </head> <body> {% if user %} {% if user.age >= 18 %} <h1>Hello {{ user.name }}, you are an adult!</h1> {% else %} <h1>Hello {{ user.name }}, you are a minor!</h1> {% endif %} {% else %} <h1>Hello, anonymous user!</h1> {% endif %} </body> </html>
在上面的代码中,使用 if 语句来控制输出,根据用户的年龄显示不同的消息。
3) 循环结构
在 Jinja 2 中,您可以使用表达式
for
来循环模板中的内容。示例代码如下:# for.py # Flask中使用for循环结构 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}] return render_template('for.html', users=users) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
templates/for.html
模板文件<!-- for.html模板 --> <!DOCTYPE html> <html> <head> <title>Hello</title> </head> <body> {% for user in users %} <h1>Hello {{ user.name }}!</h1> <p>You are {{ user.age }} years old.</p> {% endfor %} </body> </html>
在上述代码中,使用
for
循环来循环遍历用户列表信息。 。4) 宏
在 Jinja 2 中,您可以使用宏来定义可重用的代码块。示例代码如下:
# great.py # Flask中使用宏 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): users = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 30}] return render_template('great.html', users=users) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
定义宏
templates/macros.html
模板# 定义一个宏 {% macro print_user(user) %} <h1>Hello {{ user.name }}!</h1> <p>You are {{ user.age }} years old.</p> {% endmacro %}
在上面的代码中,定义了一个名为
print_us的宏。在模板中,您可以通过
import
导入宏,并使用该宏输出用户信息。模板templates/great.html
<!-- great.html模板 --> <!DOCTYPE html> <html> <head> <title>Hello</title> </head> <body> {% for user in users %} {% import 'macros.html' as macros %} {{ macros.print_user(user) }} {% endfor %} </body> </html>
在上面的代码中,定义了一个名为print_user的宏来输出用户信息。
5) 过滤器
在 Jinja 2 中,过滤器可以处理日期格式、大小写转换等变量。示例代码如下:
# filter.py # Flask中使用过滤器 from flask import Flask, render_template import datetime app = Flask(__name__) @app.route('/') def hello(): now = datetime.datetime.now() return render_template('filter.html', now=now) # 自定义过滤器 @app.template_filter('datetimeformat') def datetimeformat(value, format='%Y-%m-%d %H:%M:%S'): return value.strftime(format) if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
模板文件
模板平台 在上述代码中,定义了一个名为
在模板datetimeformat
的过滤器,用于格式化日期和时间。这里是自定义过滤器。事实上,JinJa2还内置了几个过滤器。 Jinja 2 中的内置过滤器:https://jinja.palletsprojects.com/en/3.0.x/templates/#filters过滤器名称 说明 示例 ab 返回绝对值数字 {{ -1|abs }} int(value) 将值转换为 int 类型 {{ param | int }} float(value ) 将值转换为 float 类型 string(value) 将变量转换为字符串 default_ default(value,)‸ 如果当前变量没有值,将使用参数中的值。如果想用python来判断是否为false,可以指定boolean=true。您还可以使用或替换 {{ name|default('xiaotuo') }} safe(value) 如果开启全局转义,安全过滤器将禁用变量转义 {{ content_html |safe } } escape(value) 或 e 转义字符,将 等符号转换为 HTML 符号 {{ content|escape 或 content| e }} first(value) 返回序列的第一个元素 {{ names|first }} format(value,*arags,ingtingKwargs) %s "-" %s"|format('Hello?',"Foo!") }} 输出 Hello?-Crazy! last(value) 返回序列的最后一个元素。 {{名称|最后 }} length(value) 返回序列或字典的长度。 {{名称|长度}}ue,=join ) 使用以下命令将序列连接到字符串中d 参数值 lower(value) 将字符串转换为小写 uppercase(value) 将字符串转换为小写 Replace(value,old,new) 将替换 old 的字符串替换为new shorten(value,length=255 ,killwords=False) 捕获长度为 estriptag的字符串 删除字符串中的所有HTML标签如果出现多个空格,它们将被替换为单个空格space trim 捕获字符串前后的空格 {{ p123 | trim }} wordcount 计算长字符串中的单词数 6) 继承
在 Jinja 2 中,您可以使用继承来创建包含公共元素的模板,并通过继承该模板来创建更具体的模板。示例代码如下: 上述文件中的
# extend.py # Flask中使用继承 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): return render_template('extend.html') if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
模板文件
templates/base.html
<!-- base.html模板 --> <!DOCTYPE html> <html> <head> <title>{% block title %}{% endblock %}</title> </head> <body> {% block content %}{% endblock %} </body> </html>
模板文件
html‽sablony/extend.html
<!-- extend.html模板 --> {% extends "base.html" %} {% block title %}Hello{% endblock %} {% block content %} <h1>Hello World!</h1> {% endblock %}
。模板
extend.html
中定义并继承此模板。extend.html
模板可以覆盖模板中的base.html
块并向其中添加新内容。7) 包含
在 Jinja 2 中,您可以使用 include 将一个模板包含在另一个模板中。示例代码如下:
# contain.py # Flask中使用包含 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): return render_template('contain.html') if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
模板文件
templates/contain.html
<!-- contain.html模板 --> <!DOCTYPE html> <html> <head> <title>{% block title %}{% endblock %}</title> </head> <body> {% block content %}{% endblock %} {% include "footer.html" %} </body> </html>
模板文件
模板html
<!-- footer.html模板 --> <footer> <p>© 2023</p> </footer>
位于名为footer.html
<!-- footer.html模板 --> <footer> <p>© 2023</p> </footer>
的文件中,模板
# extend.py # Flask中使用继承 from flask import Flask, render_template app = Flask(__name__) @app.route('/') def hello(): return render_template('extend.html') if __name__ == '__main__': app.run(host='0.0.0.0', port=8000, debug=True)
定义并使用模板
contain.html
中的 include 将模板footer.html
包含在页面底部。这样您就可以避免向每个页面重复添加相同的页脚。本文介绍了 Python Flask Jinja 2 语法的基础知识,包括变量、控制结构、循环结构和宏等,以及过滤器、继承和包含等高级功能。借助这些功能,您可以更方便地开发动态Web应用程序。使用这些基础知识,您可以快速开发动态 Web 应用程序。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。