目录
什么是表单处理
在 Flask 中,表单处理是指接收用户通过 HTML 表单提交的数据(通常是 POST 请求),并在视图函数中处理这些数据。Flask 提供了 request
对象来访问表单数据,同时可以通过扩展(如 Flask-WTF)简化处理和验证。
基本表单处理
使用原生 Flask 处理表单,只需结合 request
和模板即可。
示例
- 项目结构
1 2 3 4 | my_app/ ├── app.py └── templates/ └── form.html |
app.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from flask import Flask, render_template, request app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def form(): if request.method == 'POST': name = request.form.get('name', '陌生人') return f'你好,{name}!' return render_template('form.html') if __name__ == '__main__': app.run(debug=True) |
templates/form.html
表单 ¨K16K
- 解释:
methods=['GET', 'POST']
:支持 GET 和 POST 请求。request.form.get('name')
:从 POST 请求中获取表单字段name
。- GET 请求显示表单,POST 请求处理数据并返回结果。
使用 Flask-WTF 改进表单处理
Flask-WTF 是 Flask 的扩展,集成 WTForms,提供更安全、便捷的表单处理和验证功能。
安装
1 | pip install flask-wtf |
示例
- 项目结构
1 2 3 4 | my_app/ ├── app.py └── templates/ └── form.html |
app.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | from flask import Flask, render_template from flask_wtf import FlaskForm from wtforms import StringField, SubmitField from wtforms.validators import DataRequired app = Flask(__name__) app.config['SECRET_KEY'] = 'your-secret-key' # 必须设置,用于 CSRF 保护 class NameForm(FlaskForm): name = StringField('名字', validators=[DataRequired()]) submit = SubmitField('提交') @app.route('/', methods=['GET', 'POST']) def form(): form = NameForm() if form.validate_on_submit(): name = form.name.data return f'你好,{name}!' return render_template('form.html', form=form) if __name__ == '__main__': app.run(debug=True) |
templates/form.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 | <!DOCTYPE html> <html> <head> <title>表单</title> </head> <body> <form method="POST"> {{ form.hidden_tag() }} <!-- 添加 CSRF 令牌 --> <p> {{ form.name.label }}<br> {{ form.name(size=32) }} </p> <p>{{ form.submit() }}</p> </form> </body> </html> </xaiArtifact> - **解释**: - `SECRET_KEY`:用于 CSRF 保护,必须设置。 - `FlaskForm`:定义表单类,包含字段和验证器。 - `form.validate_on_submit()`:检查表单是否提交且通过验证。 - `form.hidden_tag()`:生成 CSRF 令牌。 --- ### 表单验证和错误处理 Flask-WTF 支持验证器,并在模板中显示错误消息。 #### 示例(带错误处理) **`app.py`** |
python
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Length
app = Flask(name)
app.config[‘SECRET_KEY’] = ‘your-secret-key’
class NameForm(FlaskForm):
name = StringField(‘名字’, validators=[DataRequired(), Length(min=2, max=20)])
submit = SubmitField(‘提交’)
@app.route(‘/’, methods=[‘GET’, ‘POST’])
def form():
form = NameForm()
if form.validate_on_submit():
name = form.name.data
return f’你好,{name}!’
return render_template(‘form.html’, form=form)
if name == ‘main‘:
app.run(debug=True)
templates/form.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <!DOCTYPE html> <html> <head> <title>表单</title> </head> <body> <form method="POST"> {{ form.hidden_tag() }} <p> {{ form.name.label }}<br> {{ form.name(size=32) }}<br> {% for error in form.name.errors %} <span style="color: red;">{{ error }}</span><br> {% endfor %} </p> <p>{{ form.submit() }}</p> </form> </body> </html> |
- 解释:
Length(min=2, max=20)
:限制名字长度。form.name.errors
:显示验证失败的错误消息。
参考资料
- Flask 官方文档 – Forms – 表单处理基础。
- Flask-WTF 官方文档 – Flask-WTF 使用指南。
- WTForms 官方文档 – 深入了解表单字段和验证器。
- Real Python – Flask 表单 – 表单处理的实践教程。
表单处理是 Flask 应用的重要部分。无论是基础方法还是 Flask-WTF,都能满足不同需求。如果需要更复杂的示例(例如文件上传),请告诉我!
发表回复