falsk之闪现、wtforms表单
一、闪现的用途
在 Flask 中,“闪现消息”(Flash Messages)是一种用于在不同请求之间传递一次性消息的机制。这在 Web 应用中非常实用,特别是在需要向用户展示短暂的通知、错误消息或者确认信息时。
1、闪现的用途
-
用户反馈:在用户提交表单后,告诉用户操作成功或失败,比如“提交成功”或“登录失败”。
-
跨请求传递信息:由于 HTTP 请求是无状态的,闪现消息为在不同请求间传递临时信息提供了一种便捷方式。
-
通知:提示用户关于系统状态或需要注意的内容。
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()
函数添加的。 - 该函数有两个主要参数:
with_categories
: 布尔值。如果设置为True
,则返回消息时包含类别信息。category_filter
: 可选的列表参数,允许您检索特定类别的消息。
- 这个函数用于从 Flask 的消息系统中检索已存储的消息。这些消息是通过
-
**
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 的灵活和可扩展的表单处理库,常用于前后端混合的小型项目,做表单生成和字段校验
主要特点
- 简化表单创建:WTForms 提供了一系列 Python 类,用于描述表单上的输入字段,使得开发者可以通过编写 Python 代码而不是直接编写 HTML 来定义表单。
- 验证功能:它内置了多种验证器,可以对用户输入进行验证,比如检查必填项、电子邮件格式、长度限制等。
- 可扩展性:支持自定义字段和验证器,允许开发者根据具体需求进行扩展。
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>