zoukankan      html  css  js  c++  java
  • Flask:web表单

    客户端发送的所有通过POST发出的请求信息都可以通过request.form获取.但是如果我们要生成表单的HTML代码和验证提交的表单数据那么就需要采用另外的方法.Flask-WTF扩展可以把处理web表单的过程变得更简单.

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

    import os

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

    下面我们来看下表单类.首先来看下完整的代码:

    from flask_wtf import Form,FlaskForm

    from wtforms import StringField,SubmitField

    from wtforms.validators import Required

    class NameForm(FlaskForm):

        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.

  • 相关阅读:
    sklearn KMeans聚类算法(总结)
    求素数的一个快速算法 Python 快速输出素数算法
    Java方法的多态
    Java static特性
    第一周-调用weka算法进行数据挖掘
    第一周 -神经网络算法与实现
    1【西北师大-2108Java】第一次作业成绩汇总
    第一周博客作业
    十一,专著研读(CART算法)
    十,专著研读(线性回归)
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/8414349.html
Copyright © 2011-2022 走看看