Flask:web表单

客户端发送的全部经过POST发出的请求信息均可以经过request.form获取.可是若是咱们要生成表单的HTML代码和验证提交的表单数据那么就须要采用另外的方法.Flask-WTF扩展能够把处理web表单的过程变得更简单.html

Flask-WTF能保护全部表单免受CSRF的攻击.至于CSRF的原理参考http://www.cnblogs.com/zhanghongfeng/p/7787499.html这个帖子.为了实现CSTF保护,Flask_WTF须要程序设置一个密钥.Flask-WTF用这个密钥生成加密令牌,在用令牌验证请求中表单数据的真伪.设置密钥的方法以下:web

import osflask

app.config['SECRET_KEY']=os.urandom(20)浏览器

 

下面咱们来看下表单类.首先来看下完整的代码:服务器

from flask_wtf import Form,FlaskFormsession

from wtforms import StringField,SubmitFieldapp

from wtforms.validators import Requireddom

 

class NameForm(FlaskForm):ide

    name=StringField('what is your name?',validators=[Required()])函数

    submit=SubmitField('Submit')

 

@app.route('/',methods=['GET','POST'])

def hello_world():

    name=None

    form=NameForm()

    if form.validate_on_submit():

        name=form.name.data

        form.name.data=''

return render_template('index1.html',form=form,name=name)

index1的HTML代码

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>flask test</title>

</head>

<body>

{{ name }}

<form method="POST">

    {{ form.hidden_tag() }}

    {{ form.name.label }}{{ form.name(id='my-text-field') }}

    {{ form.submit() }}

</form>

</body>

</html>

当咱们访问http://192.168.0.12:8000/的时候,网页显示以下

当咱们在输入框中输入信息则显示出咱们输入的信息

接下来咱们就来看下代码是如何运行的.首先咱们定义了一个表单类,每一个表单类都继承自

FlaskForm.这个表单类中包含一个文本字段和一个提交按钮.

WTForms中支持的HTML标准字段以下

字段类型      说  明

StringField 文本字段

TextAreaField 多行文本字段

PasswordField 密码文本字段

HiddenField 隐藏文本字段

DateField 文本字段,值为 datetime.date 格式

DateTimeField 文本字段,值为 datetime.datetime 格式

IntegerField 文本字段,值为整数

DecimalField 文本字段,值为 decimal.Decimal

FloatField 文本字段,值为浮点数

BooleanField 复选框,值为 True 和 False

RadioField 一组单选框

SelectField 下拉列表

SelectMultipleField 下拉列表,可选择多个值

FileField 文件上传字段

SubmitField 表单提交按钮

FormField 把表单做为字段嵌入另外一个表单

FieldList 一组指定类型的字段

 

再来看下视图函数.app.route修饰器中添加的methods参数告诉Flask在URL映射中把这个视图函数注册为GET和POST请求的处理程序,不然没有methods参数,将只把视图函数注册为GET请求的处理程序.

用户第一次访问程序的时候,服务器会收到一个没有表单数据的GET请求.因此validate_on_submit将返回Flase.经过渲染模板处理请求,用户会看到浏览器中显示一个表单

用户提交表单后,服务器收到一个包含数据的POST请求,valide_on_submit()会调用name字段上附属的Required函数,若是名字不为空,就能经过验证.valide_on_submit返回True.并将名字赋值给局部变量name.最终在页面上被渲染出来

 

重定向和用户会话

前面的这个表单程序,当咱们输入了用户名而且再一次刷新index的页面的时候,以前的信息已经不存在,又回到了表单提交的页面.也就说以前的用户会话没有保存下来,因此刷新后找不到以前的用户.那么要保存用户会话就要用到以前介绍的session会话

 

代码修改以下:

from flask import Flask,render_template,session,redirect,url_for

@app.route('/',methods=['GET','POST'])

def hello_world():

    form=NameForm()

    if form.validate_on_submit():

        session['name']=form.name.data

        return redirect(url_for('hello_world'))

    print session.get('name')

return render_template('index1.html',form=form,name=session.get('name'))

 

首先将name的值赋值给session[‘name’] 而后进行重定向.这里重定向使用的是redirect函数,这里重定向使用的是redirect(url_for('hello_world')).url_for(‘hello_world’)将生成对应的URL也就是’/’.这种使用方式的好处是保证URL和定义的路由兼容.url_for函数的第一个必须指定的参数名是端点名,即路由的内部名字.默认状况下,路由的端点是相应视图函数的名字,好比这里传入的是hello_world函数名

固然也能够简单点经过redirect(‘/’)的方式直接指定URL.

相关文章
相关标签/搜索