一、表达式
jinja2是一个被广泛使用的模板引擎,其设计思想源自于django模板引擎,jinja2扩展了语法,增加了强大的功能,被flask选为内置的模板语言
示例的目录结构如下 ./ ├── app.py └── templates └── name1.html
html文件:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>欢迎你 {{ name }} </p> </body> </html>
flask请求:
from flask import Flask, render_template app = Flask(__name__) @app.route('/name/<string:name>',methods=['GET']) def name(name): return render_template("name1.html", name=name) if __name__ == '__main__': app.run(debug=True)
启动服务,在浏览器里输入 http://127.0.0.1:5000/name/小风测试
二、flask模板---if语句
示例:
if.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% if name=='管理员' %} <p>原来你是管理员啊</p> {% else %} <p>欢迎你 {{ name }}</p> {% endif %} </body> </html>
flask请求:
from flask import Flask, render_template app = Flask(__name__) @app.route('/if/<string:name>',methods=['GET']) def test_if(name): return render_template('if.html',name=name) if __name__ == '__main__': app.run(debug=True)
启动服务后,在浏览器里输入 http://127.0.0.1:5000/if/小明
页面里会显示
欢迎你 小明
但如果你在浏览器里输入 http://127.0.0.1:5000/if/管理员
页面里则会显示
原来你是管理员啊
两个条件分支无法满足业务需求,你也可以使用 {% elif %} 增加逻辑判断
三、flask模板---for 语句
语法
jinja2 模板中,使用 {% 语句 %} 包围的语法块称为语句,jinja2 支持类似于 Python 的 for 循环语句,语法如下:
示例:
for.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Members</h1> <ul> {% for user in users %} <li>{{ user }}</li> {% endfor %} </ul> </body> </html>
flask请求:
from flask import Flask, render_template app = Flask(__name__) users = ['张三', '王五', '刘麻子'] @app.route('/users/3') def for_test(): return render_template('for.html', users=users) if __name__ == '__main__': app.run(debug=True)
启动服务后,在浏览器里输入 http://127.0.0.1:5000/users/3
四、flask模板---模板继承(extends)
对于模板内容重复的问题,Jinja2 提供了模板继承的支持。我们可以定义一个父模板,一般会称之为基模板(base template)。基模板中包含完整的 HTML 结构和导航栏、页首、页脚都通用部分。在子模板里,我们可以使用 extends 标签来声明继承自某个基模板。基模板中需要在实际的子模板中追加或重写的部分则可以定义成块(block)。块使用block 标签创建, {% block 块名称 %} 作为开始标记,{% endblock %} 或 {% endblock 块名称 %} 作为结束标记
示例的目录结构如下 ./ ├── app.py └── templates └── base.html └── news.html
base.html代码如下:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!--预留插入标题位置--> <title> {% block title %} {% endblock %} </title> </head> <body> <!--导航,内容固定--> <ul> <li> <a href="#">首页</a> <a href="#">新闻中心</a> <a href="#">产品中心</a> <a href="#">联系我们</a> </li> </ul> <!--预留插入网页内容部分--> {% block content %} {% endblock %} </body> </html>
news.html继承base.html自动生成固定部分,我们仅仅需要在news.html中完善预留插入位置的内容。
{% extends 'base.html' %} <!--插入到block title位置--> {% block title %} 新闻中心 {% endblock %} <!--插入到block content--> {% block content %} <h1>新闻中心</h1> <p> 这里是新闻中心页面 </p> {% endblock %}
flask请求(app.py):
from flask import Flask, render_template app = Flask(__name__) @app.route('/news') def news(): return render_template('news.html') if __name__ == '__main__': app.run(debug=True)
启动服务后,在浏览器里输入http://127.0.0.1:5000/news
效果如下:
五、flask模板---行语句
flask行语句,可以让模板的代码编写更加容易便捷,不然总是用{% ... %} 来标识挺麻烦的, 使用行语句首先需要进行设置(app.py进行设置)
app.jinja_env.line_statement_prefix = '#'
先来看一下不使用行语句时如何写一段for循环
{% for i in range(10) %}
<p>{{ i }}</p>
{% endfor %}
而一旦开启了行语句,你就可以这样写了
# for i in range(10):
<p>{{ i }}</p>
# endfor
我已经设置了行语句的前缀为# ,在模板里,只要一行代码里去掉前面的空白符后是以# 开头的,就视为行语句。
行语句的代码和我们平时写python代码一样,不用那么麻烦的用{% 和 %} 进行标记了。
若有未闭合的圆括号、花括号或方括号,行语句可以跨越多行:
<ul>
# for href, caption in [('index.html', 'Index'),
('about.html', 'About')]:
<li><a href="{{ href }}">{{ caption }}</a></li>
# endfor
</ul>
标签:__,name,Flask,app,flask,html,jinja2,模板 From: https://www.cnblogs.com/xfbk/p/16727021.html