Flask框架

本文最后更新于:2024年6月21日 凌晨

Flask框架

安装

pip install Flask

Hello World

from flask import Flask

app = Flask(__name__)

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

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

路由跳转

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

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:id>**可接收不同类型参数

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

请求与响应

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

image-20231227004214975

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>

Flask框架
https://junyyds.top/2023/05/23/Flask框架/
作者
Phils
发布于
2023年5月23日
更新于
2024年6月21日
许可协议