Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。
Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能。Flask没有默认使用的数据库、窗体验证工具
从Hello World开始
Flask程序运行过程
-
当客户端想要获取资源时,一般会通过浏览器发起HTTP请求
-
此时,Web服务器会把来自客户端的所有请求都交给Flask程序实例
-
程序实例使用Werkzeug来做路由分发(URL请求和视图函数之间的对应关系)
-
根据每个URL请求找到具体的视图函数并进行调用
- 在flask程序中,路由的实现一般是通过程序实例的装饰器实现
-
Flask调用视图函数后,可以返回两种内容:
- 字符串内容:将视图函数的返回值作为响应的内容,返回给客户端(浏览器)
- HTML模板内容:获取到数据后,把数据传入HTML模板文件中,模板引擎负责渲染HTTP响应数据,然后返回响应数据给客户端(浏览器)
导入Flask类库
from flask import Flask
创建应用实例
app = Flask(__name__)
路由解析,通过用户访问的路径,匹配相应的函数
@app.route('/')
def hello_world():
return 'Hello World!'
启动实施(只在当前模块运行)
if __name__ == '__main__':
app.run()
可以自己定义函数
@app.route("/index")
def hello():
return 'Hello World'
输入的网址为:http://127.0.0.1:5000/index
定义路由及视图函数,Flask中定义路由是通过装饰器实现的,路由默认只支持GET,如果需要增加,需要自行指定
@app.route('/', method=['GET', 'POST'])
def index():
return "hello world"
通过访问路径,获取用户的字符串参数(默认情况下是 字符串类型)
@app.route("/user/<name>")
def welcome(name):
return "Hello World, %s"%name
通过访问路径,也可以获取用户的整型参数(还有float类型float:id)
int:id:固定模式
@app.route("/user/<int:id>")
def welcome2(id):
return "Hello World, %d号的会员"%id
路由路径不能重复,用户通过唯一路径访问特定的函数
render_template
返回给用户渲染后的网页文件
import render_template
import datetime # 先导入时间包
@app.route("/")
def index2():
return render_template("index.html")
普通变量(向页面传递一些变量)
@app.route('/index')
def index():
url_str = "www.itcast.com"
return render_template('index.html', url_str=url_str)
@app.route("/")
def index2():
time = datetime.date.today() # 显示今天的日期
return render_template("index.html", var=time)
在html代码用 {{ var }}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
今天是{{ var }},欢迎光临<br>
{{ url_str }}
</body>
</html>
就可以在页面上显示今天的日期
列表类型
@app.route("/")
def index2():
time = datetime.date.today()
name = ["小张", "小王", "小赵"]
return render_template("index.html", var=time, list=name)
用大括号和百分号括起来的是控制结构,还有if
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
今天是{{ var }},欢迎光临<br/>
<br>今天值班的有:<br/>
{% for data in list %}
<li>{{ data }}</li>
{% endfor %}
</body>
</html>
输出的结果为:
今天是2021-06-23,欢迎光临
今天值班的有:
·小张
·小王
·小赵
字典类型
@app.route("/")
def index2():
time = datetime.date.today()
name = ["小张", "小王", "小赵"]
task = {"任务": "打扫卫生", "时间": "3小时"}
return render_template("index.html", var=time, list=name, task=task)
了解一下如何在页面打印表格,以及如何迭代
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
今天是{{ var }},欢迎光临<br/>
<br>今天值班的有:<br/>
{% for data in list %}
<li>{{ data }}</li>
{% endfor %}
任务:<br/>
<table border="1">
{% for key, value in task.items() %} <!--[(key,value),(key,value),(key,value)]-->
<tr>
<td>{{ key }}</td>
<td>{{ value }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
输出的结果为:
制作一个简易表格
<table border="1"> <!--border是为表格添加边框-->
<tr>
<td>测试1</td>
<td>测试2</td>
</tr>
<tr>
<td>测试1</td>
<td>测试2</td>
</tr>
<tr>
<td>测试1</td>
<td>测试2</td>
</tr>
</table>
输出结果为:
测试1 测试2
测试1 测试2
测试1 测试2
表单提交
接收表单提交的路由,需要指定method为post
@app.route('/result', methods=['POST', 'GET'])
def result():
if request.method == 'POST':
result = request.form
return render_template("test/result.html", result=result)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1">
{% for key, value in result.items() %} <!--[(key,value),(key,value),(key,value)]-->
<tr>
<th>{{ key }}</th>
<td>{{ value }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
过滤器
过滤器的本质就是函数,有时候我们不仅仅只是需要输出变量的值,我们还需要修改变量的显示,甚至格式化、运算等等,而在模板中不能直接调用Python中的某些方法,那么这就用到了过滤器
使用方式:
- 过滤器的使用方式:变量名 | 过滤器
- {{ variable | filter_name(*args) }}
- 如果没有任何参数传给过滤器,则可以把括号省略掉
- {{ variable | filter_name }}
- 如:",这个过滤器的作用:把变量variable的值的首字母转换为大写,其他字母转换为小写
链式调用
在 jinja2 中,过滤器是可以支持链式调用,示例如下:
{{ "hello world" | reverse | upper }}