0%

Flask框架

静态URL,第一个Web界面

新建脚本文件01_hello.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from flask import Flask
app = Flask(__name__)

@app.route('/') # 什么样的URL能触发函数 根目录 /
def hello_world():
return "今天天气真好,你说呢"

@app.route('/hello') # /hello
def hello():
return "hello world!"

if __name__ == '__main__':
# app.run()
# host: IP地址
# port: 端口
# debug: True 调试模式,修改代码可实时进行网页更新
app.run(host='0.0.0.0', port=1234, debug=True)

debug:调试模式

  • 在调试模式下,修改代码后,服务器会自动重启,刷新浏览器即可查看页面变化。当项目上线时,请关闭调试模式。

运行脚本文件01_hello.py

运行效果如图所示:

image-20220801115347570

网页效果:

  1. 192.168.0.162:1234

image-20220801115247865

  1. 192.168.0.162:1234/hello

image-20220801115610498

动态URL,根据网页地址获取相关参数

新建脚本文件02_user.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 动态URL
from flask import Flask
app = Flask(__name__)

@app.route('/user/<username>')
def show_user_profile(username):
return "User: %s" % username

@app.route('/post/<float:post_id>') # 可指定数据类型float
def show_post(post_id):
return "Post ID: %.3f" % post_id


if __name__ == '__main__':
app.run(host='0.0.0.0', port=1234, debug=True)

运行脚本文件

image-20220801170310515

可以发现直接进入相应IP和端口是无法访问

image-20220801171711994

进入192.168.0.162:1234/user/luoming,发现可以返回相应姓名

image-20220801171826092

进入192.168.0.162:1234/post/8080.0,可以返回相应的数字

image-20220801171959035

同一个页面绑定多个URL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from flask import Flask

app = Flask(__name__)

# 同一个视图绑定多个URL
# 用多个装饰器进行装饰即可
@app.route('/')
@app.route('/index')
def index():
return "Welcome to Flask"

if __name__ == '__main__':
# app.run()
# host: IP地址
# port: 端口
# debug: True 调试模式,修改代码可实时进行网页更新
app.run(host='0.0.0.0', port=1234, debug=True)

访问 192.168.0.162:1234

image-20220801172250096

访问 192.168.0.162:1234/index

image-20220801172313020

发现都能返回同样的结果

构造URL

Flask除了能够匹配URL,还能够生成URLFlask可以用url_for()来给指定的函数构造URL它接受函数名作为第一个参数,也接受对应URL规则的变量部分的命名参数。未知变量名部分会添加到URL末尾作为查询参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from flask import Flask, url_for, redirect

app = Flask(__name__)

@app.route('/post/<int:post_id>')
def show_post(post_id):
return 'Post ID: %d' % post_id

@app.route('/url/')
def redirect_to_url():
# 跳转到show_post()视图函数
# redirect: 重定向
return redirect(url_for('show_post', post_id=100))

if __name__ == '__main__':
# app.run()
# host: IP地址
# port: 端口
# debug: True 调试模式,修改代码可实时进行网页更新
app.run(host='0.0.0.0', port=1234, debug=True)

HTTP请求方法

例如:GET请求、POST请求

通过methods指定

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, request

app = Flask(__name__)

@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
do_the_login()
else:
show_the_login_form()

渲染模板

默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板。下面通过一个实例介绍如何渲染模板。

image-20220801173442083

index.html文件

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>Welcome to Flask</h1>
</body>
</html>

user.html文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>USER</title>
</head>
<body>
<!--jinjia2-->
<!-- {{name}} 结构表示一个变量,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。-->
<!--使用过滤器可以修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。-->
<!--常用的过滤器-->
<!--safe:渲染时不转义-->
<!--capitalize:把值的首字母转换成大写,其他字母转换成小写-->
<!--lower:把值转换成小写-->
<!--upper:把值转化成大写-->
<!--title:把值中每个单词首字母都转换成大写-->
<!--trim:把值的首尾空格去掉-->
<!--striptags:渲染之前把值中所有的HTML标签都删掉-->
<h1>Hello, [{{name|capitalize}}]</h1>
<!--Jinja2相关流程控制语句-->
<!--判断-->
<h1>
{% if name_len > 2 %}
姓名超过2个字符
{% else %}
姓名不超过2个字符
{% endif %}
</h1>
<!--循环-->
<h1>
<!-- 遍历列表-->
{% for i in ls %}
{{i}}
{% endfor %}
<!-- 遍历字典-->
<hr>
{% for key, value in dict_.items() %}
{{key}}
{{value}}
{% endfor %}
</h1>

<h1>
<!--定义宏,类似于Python中的函数-->
{% macro render_comment(comment) %}
<li>{{comment}}</li>
{% endmacro %}
<ul>
{% for comment in comments %}
<!-- 调用宏-->
{{render_comment(comment)}}
{% endfor %}
</ul>
</h1>
<hr>
<h1>导入html文件中的宏</h1>
<!--导入html文件中的宏-->
<ul>
{% import 'macros.html' as macros %}
{% for comment in comments %}
{{macros.render_comment(comment)}}
{% endfor %}
</ul>
</body>
</html>

job.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')
@app.route('/index')
def hello_world():
return render_template('index.html') # 渲染模板

@app.route('/user/<username>')
def show_user(username):
return render_template('user.html',
name=username,
name_len=len(username),
ls=[2,5,3,6,5],
dict_={'name':'骆明', 'age':'18'},
comments='今天星期三') # 渲染模板

@app.route('/base')
def base():
return render_template('use_base.html')

if __name__ == '__main__':
app.run(debug=True)

运行工程,进入 192.168.0.162:1234/

image-20220801174119393

进入192.168.0.162:1234/user/luoming

image-20220801174149829

JinJa2定义模板

base.html文件

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
{% block head %}
<title>{% block title %}{% endblock %} - My Application</title>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>

use_base.html文件

1
2
3
4
5
6
7
8
9
10
11
<!--继承base模块,创建模板-->
{% extends "base.html" %}
{% block title %}Index{% endblock %}
{% block head %}
<!--新定义的head块,因为在基模板中其内容不是空的,所以使用super()获取原来的内容-->
{{super()}}
{% endblock %}
{% block body %}
<h1>hello world!</h1>
{% endblock %}

进入 192.168.0.162:1234/base

image-20220801174257056

-------------本文结束感谢您的阅读-------------