加载模板并传递参数到模板中
from flask import Flask,render_template app = Flask(__name__,template_folder="templates") @app.route("/") def index(): data = {} data["title"] = "我的第一个flask网页" data["num"] = 100 return render_template( "index1.html", **data ) if __name__ == '__main__': app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>{{title}}</h1> <p>num={{num}}</p> </body> </html>
if判断与for循环
from flask import Flask,render_template app = Flask(__name__,template_folder="templates") @app.route("/") def index(): data = {} data["info"] = { "name":"xiaoming", "age":19, "sex":True, "class": "1009" } data["student_list"] = ["xiaoming","xiaobai","xiaohei","xiaoan"] data["goods_list"] = [ {"id":10,"name":"Python7天入门到放弃","price":99.9,"num":100}, {"id":11,"name":"Python3天入门到放弃","price":99.9,"num":100}, {"id":12,"name":"Python5天入门到放弃","price":99.9,"num":100}, {"id":13,"name":"Go7天入门到放弃","price":99.9,"num":100}, {"id":14,"name":"Go5天入门到放弃","price":99.9,"num":100}, {"id":15,"name":"Linux7天入门到放弃","price":99.9,"num":100}, ] return render_template( "index2.html", **data ) if __name__ == '__main__': app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>访问字典数据中的成员</p> <p>{{ info["name"] }}</p> <p>{{ info.name }}</p> <p>访问列表数中的成员,点语法不支持负数下标</p> <p>{{ student_list.0 }}</p> <p>{{ student_list.2 }}</p> <p>{{ student_list[-1] }}</p> <p>{{ student_list[2] }}</p> <p>if判断</p> {% if info.age < 18 %} <p>小明请出去</p> {% endif %} {% if info.age > 10 %} <p>小明同学</p> {% else %} <p>小明小朋友</p> {% endif %} {% if info.age < 10 %} <p>小明小朋友</p> {% elif info.age < 18 %} <p>小明同学</p> {% else %} <p>大明同学</p> {% endif %} <p>for循环</p> <ul> {% for student in student_list %} {% if loop.last %} #loop是flask提供给我们的循环对象,last表示当前循环最后一行 <li style="background-color:#000;color:#fff;">{{ student }}</li> {% else %} <li>{{ student }}</li> {% endif %} {% endfor %} </ul> <table border="1" align="center" width="680px"> <tr> <td>序号</td> <td>ID</td> <td>名称</td> <td>价格</td> <td>库存</td> </tr> {# flask的注释 #} {# loop 是jinja模板引擎提供给开发者获取循环中的信息对象 #} {# loop.index 显示本次循环的次数,从1开始 #} {# loop.index0 显示本次循环的次数,从0开始 #} {# loop.first 显示本次是否属于循环的第一次,是则为真 #} {% for goods in goods_list %} {% if loop.index % 2 %} <tr bgcolor="#00bfff"> {% else %} <tr> {% endif %} <td>{{ loop.index0 }}</td> <td>{{ goods.id }}</td> <td>{{ goods.name }}</td> <td>{{ goods.price }}</td> <td>{{ goods.num }}</td> </tr> {% endfor %} </table> </body> </html>
模板中显示内置变量或函数
from flask import Flask,render_template,session app = Flask(__name__,template_folder="templates") app.config["SECRET_KEY"] = "1234asda" @app.route("/") def index(): data = {} session["name"]="xiaohuihui" return render_template( "index3.html", **data ) if __name__ == '__main__': app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {# 获取上下文对象 #} <p>{{ request.url }}</p> <p>{{ request.method }}</p> <p>{{ session }}</p> <p>{{ session.name }}</p> <p>{{ config.DEBUG }}</p> <p>{{ url_for("index") }}</p> </body> </html>
过滤器
过滤器的本质就是函数。有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中是不能直接调用 Python 中的某些方法,那么这就用到了过滤器。
使用方式:
-
过滤器的使用方式为:变量名 | 过滤器。
内建过滤器
from flask import Flask,render_template,session
app = Flask(__name__, # 当前flask应用运行的模块
static_folder="static", # 当前flask应用保存静态资源[css/js/img/音视频]
static_url_path="/lib", # 当前flask应用提供给外界访问的路径前缀,必须以/开头
template_folder="templates"
)
app.config["SECRET_KEY"] = "1234asda"
@app.route("/")
def index():
data = {}
data["message"] = "hello,python, after 7 day, byebye"
data["image"] = "<img src='/lib/images/1.jpg'>"
return render_template( "index4.html", **data )
if __name__ == '__main__':
app.run(debug=True)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> img{ width: 100px; } </style> </head> <body> <p>{{ message | upper }}</p> <p>{{ image | safe }}</p> <p>{{ message | reverse | upper }}</p> <p>{{ '<em>hello</em>' | striptags }}</p> <p>{{ "如果x<y,z>x,那么x和z之间是否相等?" | striptags }}</p> <p>{{ '床前明月光,疑是地上霜。' | truncate(5,False,'...', 0)}}</p> <p>{{ [1,1,2,3,4,5,1,2,2,3,4] | unique | list }}</p> </body> </html>
字符串操作
- safe:禁用转义
<p>{{ '<em>hello</em>' | safe }}</p>
- capitalize:把变量值的首字母转成大写,其余字母转小写
<p>{{ 'hello' | capitalize }}</p>
- lower:把值转成小写
<p>{{ 'HELLO' | lower }}</p>
- upper:把值转成大写
<p>{{ 'hello' | upper }}</p>
- title:把值中的每个单词的首字母都转成大写
<p>{{ 'hello' | title }}</p>
- reverse:字符串反转
<p>{{ 'olleh' | reverse }}</p>
- format:格式化输出
<p>{{ '%s is %d' | format('name',17) }}</p>
列表操作
- first:取第一个元素
<p>{{ [1,2,3,4,5,6] | first }}</p>
- last:取最后一个元素
<p>{{ [1,2,3,4,5,6] | last }}</p>
- length:获取列表长度
<p>{{ [1,2,3,4,5,6] | length }}</p>
- sum:列表求和
<p>{{ [1,2,3,4,5,6] | sum }}</p>
- sort:列表排序
<p>{{ [6,2,3,1,5,4] | sort }}</p>
-
一种是通过Flask应用对象的 add_template_filter 方法
-
通过装饰器来实现自定义过滤器
重要:自定义的过滤器名称如果和内置的过滤器重名,会覆盖内置的过滤器。
需求:添加列表反转的过滤器 方式一 通过调用应用程序实例的 add_template_filter 方法实现自定义过滤器。该方法第一个参数是函数名,第二个参数是自定义的过滤器名称: # 自定义过滤器 def do_list_reverse(old_list): # 因为字典/列表是属于复合类型的数据,所以改动数据的结构,也会应该能影响到原来的变量 # 通过list新建一个列表进行操作,就不会影响到原来的数据 new_list = list(old_list) new_list.reverse() return new_list # 注册过滤器 app.add_template_filter(do_list_reverse, "lrev") 方式二 用装饰器来实现自定义过滤器。装饰器传入的参数是自定义的过滤器名称。 @app.template_filter('lrev') def do_list_reverse(old_list): # 因为字典/列表是属于复合类型的数据,所以改动数据的结构,也会应该能影响到原来的变量 # 通过list新建一个列表进行操作,就不会影响到原来的数据 new_list = list(old_list) new_list.reverse() return new_list
完整代码
from flask import Flask, render_template # 初始化 app = Flask(import_name=__name__,template_folder='templates') # 配置终端脚本运行项目 from flask_script import Manager manager = Manager(app) # 声明和加载配置 class Config(): DEBUG = True app.config.from_object(Config) # 自定义过滤器 def do_list_reverse(old_list): # 因为字典/列表是属于复合类型的数据,所以改动数据的结构,也会应该能影响到原来的变量 # 通过list新建一个列表进行操作,就不会影响到原来的数据 new_list = list(old_list) new_list.reverse() return new_list # 注册过滤器 app.add_template_filter(do_list_reverse, "lrev") @app.route(rule='/') def index(): data={} data["user_list"] = ["xiaoming","小黑白","小红"] return render_template("index.html",**data) if __name__ == '__main__': # 运行flask manager.run()
html调用过滤器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> <p>{{ user_list }}</p> <p>{{ user_list | lrev }}</p> <p>{{ user_list }}</p> </body> </html>
from flask import Flask,render_template,request from settings.dev import Config from flask_script import Manager """创建flask应用""" app = Flask(__name__,template_folder='templates') """使用脚手架[终端脚本]启动项目""" manage = Manager(app) """加载配置""" app.config.from_object(Config) @app.template_filter("mobile") def do_mobile(data,string): return data[:3]+string+data[7:] @app.route("/") def index(): data = {} data["user_list"] = [ {"id":1,"name":"张三","mobile":"13112345678"}, {"id":2,"name":"张三","mobile":"13112345678"}, {"id":3,"name":"张三","mobile":"13112345678"}, {"id":4,"name":"张三","mobile":"13112345678"}, ] return render_template("index2.html",**data) if __name__ == '__main__': manage.run()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table border="1" align="center" width="680"> <tr> <th>ID</th> <th>姓名</th> <th>手机</th> </tr> {% for user in user_list %} <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> <td>{{ user.mobile | mobile(string="****") }}</td> </tr> {% endfor %} </table> </body> </html>
效果: