Flask Web笔记(四)- 表单

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
    验证函数
  • Email
  • EqualTo
  • IPAdderss
  • Length
  • NumberRange
  • Optional
  • Required
  • Regexp
  • UrL
  • AnyOf
  • NoneOf

表单渲染成HTML

  1. 把NameForm 的instance form传入表单,然后再加上ID,css生成想要的页面表单
{{ form.hidden_tag() }} {{ form.name.label }} {{ form.name(d='my-text-field') }} {{ form.submit() }}
  1. 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存储要传递的值

你可能感兴趣的:(Flask Web笔记(四)- 表单)