Flask框架

安装

pip install Flask

Hello World

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"

路由跳转

路由变量规则 <>:提取参数

from flask import Flask

app = Flask(__name__)

@app.route("/", methods=['GET','POST'])
def hello_world():
return "<h1>Hello, World!</h1>"
@app.route("/chat/<int:id>")
def chat(id):
if id == 1:
return 'python'
if id == 2:
return 'JAVA'
return 'chat'

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

当访问http://127.0.0.1:5000/chat/1会返回pythonhttp://127.0.0.1:5000/chat/2会返回JAVA

\可接收不同类型参数

  • int:接收整型
  • string:接收任何不包括斜杠的文本
  • float:接收浮点数
  • path:接收包含斜杠的文本

请求与响应

现在当前文件夹创建一个文件夹templates,在里面新建index.html,结构如下:

image-20230523173002131

from flask import Flask, render_template

app = Flask(__name__)
@app.route('/index')
def index():
return render_template('index.html')

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

进入:http://127.0.0.1:5000/index,可访问

表单采用post提交

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="" method="post">
用户名:
<input type="text" name="username" placeholder="用户名"><br>
密码:
<input type="password" name="password" placeholder="密码"><br>
<input type="submit" value="登录">
</form>
</body>
</html>

app.py

from flask import Flask, render_template, request

app = Flask(__name__)
@app.route('/index', methods=['GET', 'POST'])
def index():
# 如果是GET请求,则渲染index.html模板
if request.method == 'GET':
return render_template('index.html')
# 如果是POST请求,则获取表单数据,计算结果并返回
elif request.method == 'POST':
# 获取表单数据
name = request.form.get('username')
password = request.form.get('password')
# 返回结果
return 'hello %s,your password is: %s!' % (name, password)

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

重定向 302

使用redirect重定向到百度

from flask import Flask, redirect

app = Flask(__name__)

@app.route('/index')
def index():
return redirect('http://www.baidu.com')


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

重定向到本地路由

from flask import Flask, redirect, url_for

app = Flask(__name__)

@app.route('/index')
def index():
return redirect(url_for('hello'))

@app.route('/')
def hello():
return 'Hello, World!'

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

使用JSON返回

from flask import Flask, make_response, jsonify

app = Flask(__name__)

@app.route('/index')
def index():
data = {
'name': '你好呀',
}
# return make_response(data)
return jsonify(data)
if __name__ == '__main__':
app.run()

jsonify返回 json 格式

abort函数(抛异常)

abort的常见异常值:401、403、404

from flask import Flask, abort, request, make_response, render_template

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
return render_template('index.html')
if request.method == 'POST':
name = request.form.get('username')
password = request.form.get('password')
if name == 'admin' and password == '123456':
return 'Login success'
else:
abort(404)
return None

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

自定义异常

捕捉页面404异常

from flask import Flask, abort, request, make_response, render_template

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
return render_template('index.html')
if request.method == 'POST':
name = request.form.get('username')
password = request.form.get('password')
if name == 'admin' and password == '123456':
return 'Login success'
else:
abort(404)
return None

@app.errorhandler(404)
def handle_404_error(error):
return render_template('404.html')

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

模板使用(jinja2)

@app.route('/index')
def index():
data = {
'title': 'Home',
'heading': 'Welcome to my Flask app!',
'mylist': [1, 2, 3, 4, 5]
}
return render_template('index2.html', data=data) # 将data传入html中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>index2</title>
</head>
<body>
{{ data['title'] }} 使用{{}}拿去数据
<br>
{{ data.title }}
<br>
mylist:{{ data.mylist }}
count:{{ data.mylist[1] + data.mylist[2] }} 在{{}}中可以运算
</body>
</html>

过滤器

{{ 'hello_world' | upper }}		使用''表示显示一个字符换 upper将前面的字母转为大写
过滤器 描述
abs(value) 返回一个数值的绝对值。 例如:-1
default(value,default_value,boolean=false) 判断变量的值
escape(value) 或 e 转义字符,会将<、>等符号转义成HTML中的符号。
first(value) 返回一个序列的第一个元素。names
format(value,arags,*kwargs) 格式化字符串。
length(value) 返回一个序列或者字典的长度。
join(value,d=’+’) 将一个序列用d这个参数的值拼接成字符串。
upper(value) 将字符串转换为大写。
lower(value) 将字符串转换为小写。
string(value) 将变量转换成字符串。
wordcount(s) 计算一个长字符串中单词的个数。

也可以自定义过滤器,自定义过滤器

后端表单验证

from flask import Flask, render_template, request
from wtforms import StringField, PasswordField, SubmitField # 类型
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired, EqualTo # 验证数据

app = Flask(__name__)
app.config['SECRET_KEY'] = '12345678'

# 定义表单的模型类
class RegisterForm(FlaskForm):
"""自定义的注册表单模型类"""
# 名字 验证器
user_name = StringField(label='用户名', validators=[DataRequired('用户名不能为空')])
password = PasswordField(label='密码', validators=[DataRequired('密码不能为空')])
password2 = PasswordField(label='确认密码', validators=[DataRequired(), EqualTo('password')])
submit = SubmitField(label='提交')

@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegisterForm()
if request.method == 'GET':
return render_template('register.html', form=form)
if request.method == 'POST':
username = form.user_name.data
password = form.password.data
return 'success'+'\t'+username+'\t'+password

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

register.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" method="post">
{{ form.user_name.label }}
{{ form.user_name }} <br>
{{ form.password.label }}
{{ form.password }} <br>
{{ form.password2.label }}
{{ form.password2 }} <br>
{{ form.submit }}
</form>
</body>
</html>