目录

  1. 什么是表单处理
  2. 基本表单处理
  3. 使用 Flask-WTF 改进表单处理
  4. 表单验证和错误处理
  5. 参考资料

什么是表单处理

在 Flask 中,表单处理是指接收用户通过 HTML 表单提交的数据(通常是 POST 请求),并在视图函数中处理这些数据。Flask 提供了 request 对象来访问表单数据,同时可以通过扩展(如 Flask-WTF)简化处理和验证。


基本表单处理

使用原生 Flask 处理表单,只需结合 request 和模板即可。

示例

  1. 项目结构
my_app/
├── app.py
└── templates/
    └── form.html
  1. 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)
  1. 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

示例

  1. 项目结构
my_app/
├── app.py
└── templates/
    └── form.html
  1. 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)
  1. 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 应用的重要部分。无论是基础方法还是 Flask-WTF,都能满足不同需求。如果需要更复杂的示例(例如文件上传),请告诉我!