直接用Python代码拼接HTML非常麻烦,还需要手动处理HTML转义防XSS攻击。
Flask内置 Jinja2模板引擎,实现HTML页面与Python业务代码分离。
用法
- 目录强制规范
Flask默认去项目下 templates 文件夹寻找html模板文件,文件夹名称不能随意修改。
项目结构
├── app.py
├── static/ # 静态资源
└── templates/ # 模板文件夹(目录名约定俗成,不要修改)
└── hello.htmlCode language: PHP (php)
- 核心函数:
render_template()
- 需要先导包:
from flask import render_template - 第一个参数:模板html文件名
- 后续传入关键字参数,作为变量传递到HTML模板中
return render_template('hello.html', name=name)
# 含义:打开templates/hello.html,把变量name传递给模板Code language: PHP (php)
路由示例
from flask import Flask, url_for, render_template
app = Flask(__name__)
# 两个路由,支持有无参数访问
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
# 将name变量传给hello.html模板
return render_template('hello.html', name=name)
if __name__ == '__main__':
app.run()Code language: PHP (php)
模板文件 hello.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flask例子</title>
</head>
<body>
<!-- {{ 变量名 }} 是Jinja2变量插值语法,输出变量 -->
{{ name }}
</body>
</html>Code language: HTML, XML (xml)
{{ name }}:接收后端传来的变量,自动做HTML转义,防御XSS。
访问
- 访问
http://127.0.0.1:5000/hello/→ name=None,页面空白 - 访问
http://127.0.0.1:5000/hello/Tom→ 页面输出Tom