falsk之闪现、wtforms表单

一、闪现的用途

在 Flask 中,“闪现消息”(Flash Messages)是一种用于在不同请求之间传递一次性消息的机制。这在 Web 应用中非常实用,特别是在需要向用户展示短暂的通知、错误消息或者确认信息时。

1、闪现的用途

  1. 用户反馈:在用户提交表单后,告诉用户操作成功或失败,比如“提交成功”或“登录失败”。

  2. 跨请求传递信息:由于 HTTP 请求是无状态的,闪现消息为在不同请求间传递临时信息提供了一种便捷方式。

  3. 通知:提示用户关于系统状态或需要注意的内容。

2、闪现的本质

  闪现消息基于会话(Session)机制实现。它在应用程序的请求中存储消息,通常只在下次请求中有效。具体来说,它利用会话存储在服务器端的数据在不同请求之间保持用户状态。

  当使用 flash 函数时,Flask 将消息存储在当前会话中。而在下一个请求中,您可以通过 get_flashed_messages 函数检索这些消息。因为消息被设置为一次性,所以在检索后会自动删除,确保不会在后续请求中重复出现。

3、小案例

flash('name提交成功!')  存消息

get_flashed_messages() 取消息

from flask import Flask, flash, render_template, redirect, url_for, get_flashed_messages

app = Flask(__name__)
app.secret_key = 'your_secret_key'  # 必须设置以支持会话

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

@app.route('/submit', methods=['POST'])
def submit():
    # 假设在此处理表单提交
    # 成功处理后闪现一条消息
    flash('表单提交成功!')
    return redirect(url_for('index'))

@app.route('/display')
def display():
    messages = get_flashed_messages()
    return render_template('display.html', messages=messages)

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

html页面

# index
<!doctype html>
<html>
<head>
    <title>闪现消息示例</title>
</head>
<body>
    <form action="{{ url_for('submit') }}" method="post">
        <input type="text" name="name" placeholder="输入名字">
        <input type="submit" value="提交">
    </form>
</body>
</html>

# display
<!doctype html>
<html>
<head>
    <title>显示消息</title>
</head>
<body>
    {% with messages = get_flashed_messages() %}
      {% if messages %}
        <ul>
          {% for message in messages %}
            <li>{{ message }}</li>
          {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}
</body>
</html>

4、设置分类取出

from flask import Flask, flash, render_template, redirect, url_for, get_flashed_messages

app = Flask(__name__)
app.secret_key = 'your_secret_key'

@app.route('/submit')
def submit():
    flash('信息已成功提交!', 'success')
    flash('发生一个警告!', 'warning')
    return redirect(url_for('display'))

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

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

html 页面

<!doctype html>
<html>
<head>
    <title>显示消息</title>
</head>
<body>
    {% with messages = get_flashed_messages(with_categories=True) %}
      {% if messages %}
        <ul>
          {% for category, message in messages %}
            <li class="{{ category }}">{{ message }}</li>
          {% endfor %}
        </ul>
      {% endif %}
    {% endwith %}
</body>
</html>

<style>
    .success { color: green; }
    .warning { color: orange; }
    .error { color: red; }
</style>

补充:

Flask 提供了 flash() 和 get_flashed_messages() 函数来帮助在网页重定向后传递简短的消息。get_flashed_messages() 通常用于在模板中获取这些消息进行展示。

下面是对 {% with messages = get_flashed_messages(with_categories=True) %} 的详细介绍:

基本功能

  • **get_flashed_messages()**:

    • 这个函数用于从 Flask 的消息系统中检索已存储的消息。这些消息是通过 flash() 函数添加的。
    • 该函数有两个主要参数:
      1. with_categories: 布尔值。如果设置为 True,则返回消息时包含类别信息。
      2. category_filter: 可选的列表参数,允许您检索特定类别的消息。
  • **with_categories=True**:

    • 当设置为 True 时,get_flashed_messages() 返回一个包含类别和消息内容的元组列表。
    • 这意味着每条消息将以 (category, message) 的形式返回,使您可以在模板中根据类别对消息进行不同的处理(例如不同的样式)。

使用 {% with %} 控制结构

  • **{% with ... %}**:这是一种 Jinja2 模板的控制结构,用于临时存储一个变量,以便在模板的一部分中使用。
  • 在 {% with messages = get_flashed_messages(with_categories=True) %} 中,with 语句将 get_flashed_messages() 的结果分配给变量 messages
  • 这样做的目的是在同一个模板块内高效地访问并处理这些消息,而不需要多次调用 get_flashed_messages()

 二、wtforms 表单

1、WTForms 是一个用于 Python 的灵活和可扩展的表单处理库,常用于前后端混合的小型项目,做表单生成和字段校验

主要特点

  1. 简化表单创建:WTForms 提供了一系列 Python 类,用于描述表单上的输入字段,使得开发者可以通过编写 Python 代码而不是直接编写 HTML 来定义表单。
  2. 验证功能:它内置了多种验证器,可以对用户输入进行验证,比如检查必填项、电子邮件格式、长度限制等。
  3. 可扩展性:支持自定义字段和验证器,允许开发者根据具体需求进行扩展。

2、代码示例

pip install WTForms

from flask import Flask, render_template, request, redirect
from wtforms import Form, validators, widgets
from wtforms.fields import simple

app = Flask(__name__, template_folder='templates')

app.debug = True

class LoginForm(Form):
    # 字段(内部包含正则表达式)
    name = simple.StringField(
        label='用户名',
        validators=[
            validators.DataRequired(message='用户名不能为空.'),
            validators.Length(min=6, max=18, message='用户名长度必须大于%(min)d且小于%(max)d')
        ],
        widget=widgets.TextInput(),  # 页面上显示的插件
        render_kw={'class': 'form-control'}

    )
    # 字段(内部包含正则表达式)
    pwd = simple.PasswordField(
        label='密码',
        validators=[
            validators.DataRequired(message='密码不能为空.'),
            validators.Length(min=8, message='用户名长度必须大于%(min)d'),
            validators.Regexp(regex="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,}",
                              message='密码至少8个字符,至少1个大写字母,1个小写字母,1个数字和1个特殊字符')

        ],
        widget=widgets.PasswordInput(),
        render_kw={'class': 'form-control', 'xx': 'xxx'}
    )


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        form = LoginForm()
        return render_template('login.html', form=form)
    else:
        form = LoginForm(formdata=request.form)
        if form.validate():
            print('用户提交数据通过格式验证,提交的值为:', form.data)
        else:
            print(form.errors)
        return render_template('login.html', form=form)


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

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录</h1>
<form method="post">
    <p>{{form.name.label}} {{form.name}} {{form.name.errors[0] }}</p>

    <p>{{form.pwd.label}} {{form.pwd}} {{form.pwd.errors[0] }}</p>
    <input type="submit" value="提交">
</form>
</body>
</html>  

 

posted @ 2024-11-04 16:47  凡人半睁眼  阅读(6)  评论(0编辑  收藏  举报