马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Flask模板渲染
什么是模板
Flask利用jinja2作为默认模板引擎
作用:将html页面与python业务代码分离,页面中嵌入动态变量,循环,判断逻辑,后端传入数据,引擎的主动渲染天生完备的html返回欣赏器
目次规范
flask默认从templates目次下加载模板
核心渲染函数(render_template)
导入与根本用法
- from flask import Flask,render_template
- app = Flask(__name__)
- @app.route("/")
- def index():
- # 直接返回index.html页面,从templates目录下面找
- return render_template("index.html")
- if __name__ == '__main__':
- app.run(debug=True)
复制代码- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>index</title>
- </head>
- <body>
- <h1>welcome index page</h1>
- </body>
- </html>
复制代码
变量的环境
变量,字典,类名
html中变量用{{变量名}} 包裹起来- @app.route("/test1")
- def test1():
- username = "admin"
- password = "123"
- # 使用test1.html文件,username 将值传入给模板文件中去
- return render_template("test1.html",username=username,password=password)
复制代码- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>test1</title>
- </head>
- <body>
- <h1>username:{{username}}</h1>
- <h1>psd:{{password}}</h1>
- </body>
- </html>
复制代码
字典的环境- @app.route("/test1")
- def test1():
- username = "admin"
- password = "123"
- data = {
- "name": "zhangsan",
- "age": 18
- }
- # 直接传入data字典
- return render_template("test1.html",username=username,password=password,data=data)
复制代码 html文件- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>test1</title>
- </head>
- <body>
- <h1>username:{{username}}</h1>
- <h1>psd:{{password}}</h1>
- </body>
- </html>[size=6]{{data.name}},{{data.age}}[/size]
复制代码 关于类的环境- class User():
- def __init__(self,sex):
- self.sex=sex
- @app.route("/test1")
- def test1():
- username = "admin"
- password = "123"
- data = {
- "name": "zhangsan",
- "age": 18
- }
- user = User("男")
- return render_template("test1.html",username=username,password=password,data=data,user=user)
复制代码- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>test1</title>
- </head>
- <body>
- <h1>username:{{username}}</h1>
- <h1>psd:{{password}}</h1>
- </body>
- </html>[size=6]{{data.name}},{{data.age}}[/size]
- [size=6]{{user.sex}}[/size]
复制代码 jinja2模板根本语法
变量渲染
变量用{{变量名}}来渲染- <p>用户名:{{ username }}</p>
- <p>年龄:{{ user_age + 5 }}</p>
- <p>爱好第一条:{{ hobby[0] }}</p>
- <p>字典取值:{{ user["id"] }} 或 {{ user.id }}</p>
复制代码 控制语句
- {% if age > 18 %}
- 你已经成年了
- {% elif age < 18 %}
- 你还没有成年
- {% else %}
- 刚满18岁
- {% endif %}
复制代码- @app.route("/if_for")
- def if_for():
- age = 19
- # 给html中的age传入值
- return render_template("if-for.html",age=age)
复制代码 for循环
- {% if age > 18 %}
- 你已经成年了
- {% elif age < 18 %}
- 你还没有成年
- {% else %}
- 刚满18岁
- {% endif %}{% for i in data %}name: {{i["name"]}}age: {{i["age"]}}{% endfor %}
复制代码- @app.route("/if_for")
- def if_for():
- age = 19
- data = [
- {"name": "zhangsan", "age": 18},{"name": "lisi", "age": 19}
- ]
- # 传入列表进去,循环,得到每一个字典,然后通过字典取值来获取即可
- return render_template("if-for.html",age=age,data=data)
复制代码 解释
- 不会渲染到最终的html上,仅在模块内注释
- {# 注释内容 #}
复制代码 过滤器(filter)
对输出变量做格式化、转义、处置惩罚,支持链式调用 var|f1|f2- {{ username|upper }}
- {{ username|capitalize }}
- {{ hobby|length }}
- {{ desc|default("暂无描述") }}
- {{ 3.1415 | round(2) }}
- {{ content|truncate(5) }}
- {{ hobby|reverse }}
复制代码- <h1>{{username|upper}}</h1>
复制代码- @app.route("/test2")
- def test2():
- return render_template("test2.html",username="admin")
复制代码
模板继续(最常用,复用公共页面)
标签作用{% extends "base.html" %}声明当前模板继续自 base.html(必须放在第一行){% block name %}...{% endblock %}界说一个可被子模板覆盖的地区{{ super() }}在子模板 block 中调用父模板同名 block 的内容父模板- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
-
- <title>{% block title %} 默认标题 {% endblock %}</title>
- </head>
- <body>
-
- <nav>网站导航|首页|个人中心</nav>
- {% block content %} {% endblock %}
- <foote>版权所有 2026flask演示</foote>
- </body>
- </html>
复制代码 子模板- {% extends "base.html" %}
- {% block title %}
- 这个我的首页网站
- {% endblock %}
- {% block content %}
- <h1>欢迎来到我的首页</h1>
- {% endblock %}
复制代码- # 父模板
- @app.route("/base")
- def base():
- return render_template("base.html")
- # 子模板
- @app.route("/zi")
- def zi():
- return render_template("子模板1.html")
- @app.route("/z2")
- def z2():
- return render_template("子模板2.html")
复制代码 父模板
子模板
静态文件加载
除了html代码后,尚有css,js,图片,这些静态文件,存放在static文件中,通过url_for来加载这些静态文件
须要创建一个static目次,用来存放静态文件的
- @app.route("/test/static")
- # 不能写成static函数,关键字,运行会报错
- def template_static():
- return render_template("static.html")
复制代码- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>静态文件加载</title>
- </head>
- <body>
- <h1 >静态文件加载</h1>
- </body>
- </html>
复制代码- .title {
- background-color: red;
- }
复制代码 访问,静态文件没有被加载
添加link就能收效,就能加载静态文件了- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>静态文件加载</title>
- </head>
- <body>
- <h1 >静态文件加载</h1>
- </body>
- </html>
复制代码
尚有一种写法就是,直接点- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>静态文件加载</title>
- </head>
- <body>
- <h1 >静态文件加载</h1>
- </body>
- </html>
复制代码 |