第4天:表单处理与用户输入
表单处理简介
Web表单是用户与服务器交互的主要方式之一。用户可以在表单中输入数据,并通过HTTP请求提交给服务器。Flask提供了多种工具来处理这些表单数据。
创建HTML表单
HTML表单由<form>
标签定义,包含不同类型的输入字段,如文本框、密码框、单选按钮、复选框等。
示例HTML表单 (templates/form.html
):
<!DOCTYPE html>
<html>
<head>
<title>Sign Up</title>
</head>
<body>
<h1>Sign Up</h1>
<form method="post" action="/signup">
<label for="username">Username:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password"><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
在Flask中处理表单数据
- 创建视图函数:
- 视图函数需要处理POST请求,因为表单数据是在表单提交时通过POST请求发送的。
示例视图函数:
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/signup', methods=['GET', 'POST'])
def signup():
if request.method == 'POST':
# 获取表单数据
username = request.form['username']
password = request.form['password']
# 处理数据...
return 'Signup successful'
return render_template('form.html')
使用WTForms进行表单验证
WTForms是一个Flask扩展,它提供了表单处理和数据验证的功能。
-
安装WTForms:
pip install Flask-WTF
-
定义表单类:
- 创建一个Python类,继承自
flask_wtf.FlaskForm
,并使用WTForms的字段类型定义表单字段。
- 创建一个Python类,继承自
示例WTForms表单类:
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import InputRequired
class SignupForm(FlaskForm):
username = StringField('Username', validators=[InputRequired()])
password = PasswordField('Password', validators=[InputRequired()])
- 在视图函数中使用表单类:
- 将表单类实例化,并在视图函数中使用它来渲染和验证表单数据。
示例视图函数(使用WTForms):
from flask import render_template, flash, redirect, url_for
from forms import SignupForm # 假设你的表单类在forms.py文件中
@app.route('/signup', methods=['GET', 'POST'])
def signup():
form = SignupForm()
if form.validate_on_submit(): # 检查是否通过验证
username = form.username.data
password = form.password.data
# 处理数据...
flash('Signup successful', 'success')
return redirect(url_for('index'))
return render_template('form.html', form=form)
表单的CSRF保护
Flask-WTF提供了CSRF(跨站请求伪造)保护,以增强表单的安全性。
-
生成CSRF令牌:
- Flask-WTF会自动为每个表单生成一个CSRF令牌。
-
在模板中包含CSRF令牌:
- 在HTML表单中添加一个隐藏的CSRF令牌字段。
示例包含CSRF令牌的表单:
<form method="post" action="/signup">
{{ form.hidden_tag() }} <!-- 包含CSRF令牌 -->
<!-- 其他表单字段 -->
<input type="submit" value="Submit">
</form>
结语
今天,我们学习了如何在Flask中创建和处理HTML表单,以及如何使用WTForms进行表单验证和CSRF保护。表单处理是Web应用中与用户交互的重要部分,正确处理表单数据对于构建安全且用户友好的应用至关重要。
明天,我们将学习Flask中的会话管理和Cookies,这将帮助我们管理用户的会话状态。
记得尝试创建自己的表单,并使用WTForms进行验证。这是一个很好的实践机会,可以帮助你加深对表单处理的理解。