zoukankan      html  css  js  c++  java
  • flask 处理表单数据 --

    处理表单数据

    表单数据的处理涉及很多内容,从获取数据到保存数据大致有以下步骤:

    1、  解析请求,获取表单数据

    2、  对数据进行必要的转换,比如讲勾选框的值转换成python的布尔值

    3、  验证数据是否符合要求,同时验证CSRF令牌。

    4、  如果验证未通过则需要生成错误消息,并在模板中显示错误消息。

    5、  如果验证通过,就把数据保存到数据库或做进一步处理

    使用Flask-WTF和WTForms可以极大地简化这些步骤

    提交表单

    在HTML中,当<form>标签声明的表单中类型为submit的提交字段被单击时,就会创建一个表单的HTTP请求,请求中包含表单各个字段的数据。表单的提交行为主要有三个属性控制,如下表:

     

    form标签的action属性用来指定表单被提交的目标URL,默认为当前URL,就是渲染该模板的路由所在的URL。

    当使用get方法提交表单时,表单的数据会以查询字符串的形式附加在请求的URL里,如:

    127.0.0.1:5000:/basic?username=xiaxiaoxu&password=12345

    GET方式仅适用于长度不超过3000个字符,且不包含敏感信息的表单。因为这种方式会直接将用户提交的表单数据暴露在URL中,容易被攻击者截获,实例中的情况是危险的。因此处处于安全的考虑,我们一般使用post方法提交表单。使用post方式时,按照默认的编码类型,表单数据会存储在请求主体中,比如:

    POST /basic HTTP/1.0

    Content-Type:application/x-www-form-urlencoded

    Content-Length:30

    username=xiaxiaoxu&12345

    Flask为路由设置默认的监听方法是GET,为了支持接收表单提交发送的POST请求,我们需要在app.route()装饰器里使用methods关键字为路由指定HTTP方法,比如:

    @app.route('/',methods=['GET','POST'])
    def basic():
        form=LoginForm()
        return render_template('basic.html',form=form)

    验证表单数据

    客户端验证和服务器端验证

    表单的验证通常分为以下几种形式

    客户端验证

    客户端验证是指在客户端(比如web浏览器)对用户的输入值进行验证。比如,使用HTML5内置的验证属性即可实现基本的客户端验证(type、required、min、max、accept等)。

    例如,给username字段添加required标志:

    <input type=”text” name=”username” required>

    如果用户没有输入内容而按下提交按钮,会弹出浏览器内置的错误提示

    和其他附件HTML属性相同,我们可以在定义表单时通过render_kw传入这些属性,或是在渲染表单时传入,像requiredd这类布尔值属性,值可以为空或是任意ASCII字符,如:

    {{ form.username(required=’’) }}

    除了使用HTML5提供的属性实现基本的客户端验证,我们通常会使用javaScript实现完善的验证机制,比如使用javaScript表单验证库-jQuery

    客户端方式可以实时动态提示用户输入是否正确,只有用户输入正确后才会将表单数据发送到服务器,客户端验证可以增强用户体验,降低服务器负载。

    服务器端验证

    服务器端验证是指用户把输入的数据提交到服务器端,在服务器端对数据进行验证。如果验证出错就会在响应中加入错误信息。用户修改后再提交表单,知道通过验证。在flask中使用WTForms实现的就是服务器端验证

    WTForms验证机制

    WTForms验证表单字段的方式是在实例化表单类时传入表单数据,然后对表单实例调用validate()方法。这会逐个对字段调用字段实例化时定义的验证器,返回表示验证结果的布尔值。如果验证失败,就把错误消息存储到表单实例的errors属性对应的字典中,验证的过程如下所示:

    >>> from app import app
    >>> from flask import request
    >>> app.test_request_context('/basic').push()#激活请求上下文
    >>> from flask import current_app
    >>> app.app_context().push()#激活程序上下文
    >>> current_app.name
    'app'
    >>>#定义LoginForm类
    >>> from wtforms import Form, StringField,PasswordField,BooleanField
    >>> from wtforms.validators import DataRequired,length
    >>> class LoginForm(Form):
    ...     username = StringField('Username', validators=[DataRequired()])
    ...     password = PasswordField('Password',validators=[DataRequired(),length(8,128)])
    ...
    >>> form = LoginForm(username='',password='123')
    >>> form.data  #表单数据字典
    {'username': '', 'password': '123'}
    >>> form.validate()
    False
    >>> form.errors
    {'username': [u'This field is required.'], 'password': [u'Field must be between 8 and 128 characters long.']}
    >>> form2 = LoginForm(username='xiaxiaoxu', password='123456')
    >>> form2.data  #表单数据字典
    {'username': 'xiaxiaoxu', 'password': '123456'}
    >>> form2.validate()
    False
    >>> form2.errors  #错误消息字典
    {'password': [u'Field must be between 8 and 128 characters long.']}
    >>> form3 = LoginForm(username='xiaxiaoxu', password='123456789')
    >>> form3.data
    {'username': 'xiaxiaoxu', 'password': '123456789'}
    >>> form3.validate()
    True
    >>> form3.errors
    {}

    因为表单使用POST方法提交,如果单纯使用WTForms,在实例化表单时需要首先把request.form传入表单类(LoginForm(username='',password='123')),而使用Flask-WTF时,表单类继承的FlaskForm基类默认会从request.form获取表单数据,所以不需要手动传入。

    使用POST方法提交的表单,其数据会被Flask解析成为一个字典,可以通过请求对象的form属性获取(request.form);使用GET方法提交的表单的数据同样会被解析为字典,不过要通过请求对象的args属性获取(request.args)。

  • 相关阅读:
    【Windows】Windows服务管家婆之Service Control Manager
    【Python】python文件名和文件路径操作
    【Python】python 调用c语言函数
    IIS 之 HTTP Error 404.2 – Not Found(ISAPI 和 CGI 限制)
    IIS 之 HTTP错误 404.17
    IIS 之 HTTP 错误 404.3
    IIS 之 HTTP 错误 403.14
    IIS 之 打开/关闭 Internet 信息服务
    Wcf 之 配置文件解析
    Web Service 之 开发、部署
  • 原文地址:https://www.cnblogs.com/xiaxiaoxu/p/10513751.html
Copyright © 2011-2022 走看看