Web 表单
处理web表单的扩展 Flask-WTF
pip install flask-wtf
跨域请求伪造保护(CSRF)
Flask-WTF 能保护所有的表单免受跨站请求伪造的攻击。 恶意网站把请求发动到被攻击这已经登陆的其他网站时就会有CSRF的攻击
为了实现CSRF的保护,Flask-WTF需要程序设置一个密钥,Flask-WTF会使用这个密钥去生成加密令牌,在用令牌验证请求中的表单数据的真伪。
app = Falsk(__name__)
app.config['SECRET_KEY'] = 'hard to guess string'
app.config 存储配置,可以从文件或者环境变量中导入配置值。
表单类
from flask.ext.wtf import Form
from wtforms import StringField, SubmitField
from wtforms.validators import Required
class NameForm(Form):
name = StringField('What is your name?', validators=[DataRequired()])
submit = SubmitField('Submit')
- StringField
- TextAreaField
- PasswordField
- HiddenField
- DateField
- DateTimeField
- IntegerField
- DecimalField
- FloatField
- BooleanField
- RadioField
- SelectField
- SelectMultipleField
- FileField
- SubmitField
- FormField
- FieldList
验证函数 - EqualTo
- IPAdderss
- Length
- NumberRange
- Optional
- Required
- Regexp
- UrL
- AnyOf
- NoneOf
表单渲染成HTML
- 把NameForm 的instance form传入表单,然后再加上ID,css生成想要的页面表单
<form method="POST">
{{ form.hidden_tag() }}
{{ form.name.label }}
{{ form.name(d='my-text-field') }}
{{ form.submit() }}
</form>
- Flask-WTF提供渲染函数 quick_form(form)
{% import 'bootstrap/wtf.html' as wtf %}
{{ wtf.quick_form(form) }}
视图中的表单处理
- 提交表单要给route的装饰器中添加methods参数, 把视图函数注册为GET/POST(第一次访问为GET,submit是post请求)
- 提交前要使用 validate_on_submit()验证
@app.route('/', methods=['GET', 'POST'])
def index():
form = NameForm()
if form.validate_on_submit():
user = User.query.filter_by(username=form.name.data).first()
if user is None:
user = User(username=form.name.data)
db.session.add(user)
session['know']=False
#if app.config['FLASKY_ADMIN']:
send_mail(user, 'New User', 'mail/new_user', user=user)
else:
session['know'] = True
send_mail(user.username, 'New User', 'mail/new_user', user=user)
#if session['know']:
#flash("User exist")
session['name'] = form.name.data
form.name.data = ''
return redirect(url_for('index'))
return render_template('index.html', form=form, name=session.get('name'), know = session.get('know'))
Post/重定向/Get
程序发出的最后一个请求应该是get请求,使用redirect重定向,用session存储要传递的值