目录
什么是表单处理
在 Flask 中,表单处理是指接收用户通过 HTML 表单提交的数据(通常是 POST 请求),并在视图函数中处理这些数据。Flask 提供了 request
对象来访问表单数据,同时可以通过扩展(如 Flask-WTF)简化处理和验证。
基本表单处理
使用原生 Flask 处理表单,只需结合 request
和模板即可。
示例
- 项目结构
my_app/
├── app.py
└── templates/
└── form.html
app.py
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,提供更安全、便捷的表单处理和验证功能。
安装
pip install flask-wtf
示例
- 项目结构
my_app/
├── app.py
└── templates/
└── form.html
app.py
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
<!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
<!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,都能满足不同需求。如果需要更复杂的示例(例如文件上传),请告诉我!
发表回复