【flask】处理表单数据

 表单数据的处理涉及很多内容,除去表单提交不说,从获取数据到保存数据大致会经历以下步骤:

  1. 解析请求,获取表单数据。
  2. 对数据进行必要的转换,比如将勾选框的植转换为Python的布尔值。
  3. 验证数据是否符合要求,同时验证CSRF令牌
  4. 如果验证未通过则需要生成错误消息,并在模板中显示错误消息。
  5. 如果通过验证,就把数据保存到数据库或做进一步处理。

验证表单数据

1. 客户端验证和服务器端验证
表单的验 证通 常分为 以下两种形式:
( 1)客户端验证
客户端验证( client side validation)是指在客户端(比如 Web 浏览器)对用户的输入值进行

验证。 比如,使用 HTML5 内置的验证属性即可实现基本的客户端验证( type、 required、 min、 max、 accept 等) 。 比如,下面的 username 字段添加了 required 标志:

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

客户端验证可以增强用户体验,降低服务器负载 。

2.服务器端验证

服务器端验证 (server side validation)是指用户把输入的数据提交到服务器端,在服务器端 对数据进行验证 。 如果验证出错,就在返回的响应中加入错误信息 。 用户修改后再次提交表单 , 直到通过验证。 我们在 Flask程序中使用 WTForms 实现的就是服务器端验证。

在这里我们不必纠结使用何种形式,因为无论你是否使用客户端验证,服务器端验证都是

必不可少的,因为用户可以通过各种方式绕过客户端验证 , 比如在客户端设置禁用 JavaScript。

WTForms 验证机制

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

知识扩展:

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

在视图函数中验证表单

因为现在的 basic form视图同时接收两种类型的请求: GET请求和 POST请求。 所以我们 要根据请求方法 的不同执行不同的代码 。 具体来说 : 首先是实例化表单,如果是 GET 请求,那 么就渲染模板;如果是 POST 请求,就调用 validate()方法验证表单数据

Flask-WTF提供的 validate_on_submit()方法合并了这两个操作,

因此上面的代码可以简化为:

@app.route(‘/basic‘,methods=[‘GET‘,‘POST‘])
def basic():
    form = LoginForm()
    if form.validate_on_submit():
        username=form.username.data

    return render_template(‘basic.html‘,form=form)

如果 form.validate_on_submit()返回 True,则表示用户提交了表单,且表单通过验证,那么

我们就可以在这个 if语句内获取表单数据

表单类的 data属性是一个匹配所有字段与对应数据的字典,我们一般直接通过“ form. 字段 属性名 .data”的形式来获取对应字段的数据。 例如, form.username.data返回 username字段的 值 。

在模板中渲染错误消息

如果 form.validate_on_submit()返回 False,那么说明验证没有通过。 对于验证未通过的字 段, WTForms 会把错误消息添加到表单类的 errors 属性中,这是一个匹配作为表单字段的类属 性到对应的错误消息列表的字典 。 我们一般会直接通过字段名来获取对应字段的错误消息列表, 即“ form. 字段名 .errors” 。 比如, form.name.errors 返回 name 字段的错误消息列表 。

{%for message in form.username.errors%}
        <small class="error">{{message}}</small><br>
    {%endfor%}

basic.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

<!--    为了让错误消息更加醒目,我们为错误消息元素添加了 error 类,这个样式类在 style.css --’4 文件中定义,它会将文字颜色设为红色 -->
<style>
small.error
{
    color:red;
    background-color:yellow;
}
</style>
</head>
<body>
<form method="post">
    {{form.csrf_token}}
    {{form.username.label}}<br>
    {{form.username}}<br>
    {%for message in form.username.errors%}
        <small class="error">{{message}}</small><br>
    {%endfor%}
    {{form.password.label}}<br>
    {{form.password}}<br>
    {%for message in form.password.errors%}
        <small class="error">{{message}}</small>
    {%endfor%}
    {{form.remember}}{{form.remember.label}}<br>
    {{form.submit}}<br>
</form>
</body>
</html>

forms.py

from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,BooleanField,SubmitField
from wtforms.validators import DataRequired,Length

class LoginForm(FlaskForm):
    username=StringField(‘Username‘,render_kw={‘placeholder‘:‘Your Username‘},validators=[DataRequired()])
    password=PasswordField(‘Password‘,validators=[DataRequired(),Length(8,128)])
    remember=BooleanField(‘Remember me‘)
    submit = SubmitField(‘Log in‘)

app.py

from flask import  Flask,render_template,redirect,url_for,flash
from demo1.form.forms import LoginForm

app = Flask(__name__)
app.secret_key=‘secret string‘

@app.route(‘/‘)
def index():
    return ‘这是首页‘

@app.route(‘/basic‘,methods=[‘GET‘,‘POST‘])
def basic():
    form = LoginForm()
    if form.validate_on_submit():
        username=form.username.data
        flash(‘Welcome home,%s!‘%‘Test flash‘)
        return redirect(url_for(‘index‘))
    return render_template(‘basic.html‘,form=form)

if __name__==‘__main__‘:
    app.run(debug=True)

  效果1:客户端required验证

效果2:服务器返回的错误信息 

 表单处理过程:

原文地址:https://www.cnblogs.com/kaerxifa/p/11829689.html

时间: 2024-10-01 21:16:34

【flask】处理表单数据的相关文章

Flask--(一对多)模型渲染表单数据

模型建立一一对多模型: 多表添加外键,建立两张表之间的关系 一表关联多表的属性,可以方便快速访问多表的数据 模板一层循环渲染一表数据,二层循环渲染多表的数据 代码展示: from flask import Flask # Flask参数,可以配置静态文件路由,及文件夹 from flask import render_template from flask.ext.sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQL

使用jQuery实现跨域提交表单数据

我们在WEB开发中有时会遇到这种情况,比如要从A网站收集用户信息,提交给B网站处理,这个时候就会涉及到跨域提交数据的问题.本文将给您介绍如何使用jQuery来实现异步跨域提交表单数据. 在jQuery中,我们使用json数据类型,通过getJSON方法来实现从服务端获取或发送数据,而当要向不同远程服务器端提交或者获取数据时,要采用jsonp数据类型.使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面.服务器端应当在JSON数据前加上回调函数名,以便

Struct2提交表单数据到Acion

Struct2提交表单数据到Action,Action取表单的数据,传递变量.对象 HTML.jsp <form action="reg.do" method="post"> <input> LoginAction get post 1.action里通过属性获取get.set方法获取. 2.模型驱动 3.model对象 action中要有和表单域对应的属性名,并且要有相应的符合javabean规范的set和get方法 http://blog

jQuery 序列化表单数据 serialize() serializeArray()

1.serialize()方法 格式:var data = $("form").serialize(); 功能:将表单内容序列化成一个字符串. 这样在ajax提交表单数据时,就不用一一列举出每一个参数.只需将data参数设置为 $("form").serialize() 即可. 2.serializeArray()方法 格式:var jsonData = $("form").serializeArray(); 功能:将页面表单序列化成一个JSON

如何发送HTML表单数据

多数时候,HTML表单的目的只是为了把数据发给服务器,之后服务器再处理这些数据并发送响应给用户.虽然看起来挺简单的,但我们还是得注意一些事情以确保传送的数据不会破坏服务器.或者给你的用户制造麻烦. 数据会到哪里去 关于客户端/服务器架构 整个web都是基于一种基本的客户端/服务器架构,该架构可以归纳如下: 一个客户端(通常是Web浏览器)使用HTTP协议发送一个请求给服务器(通常是web服务器程序,譬如Apache, Nginx, IIS, Tomcat等等),而服务器则以相同的协议响应这个请求

怎么获取表单数据

import java.io.IOException;import java.io.PrintWriter; import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpS

Servlet学习笔记(二):表单数据

很多情况下,需要传递一些信息,从浏览器到 Web 服务器,最终到后台程序.浏览器使用两种方法可将这些信息传递到 Web 服务器,分别为 GET 方法和 POST 方法. 1.GET 方法:GET 方法向页面请求发送已编码的用户信息.页面和已编码的信息中间用 ? 字符分隔,如下所示:http://www.test.com/hello?key1=value1&key2=value2 GET 方法是默认的从浏览器向 Web 服务器传递信息的方法,它会产生一个很长的字符串,出现在浏览器的地址栏中.如果您

JSP简单练习-获取表单数据

在JSP中,server端程序与client交互最经常使用的方法就是採用表单提交数据.表单提交的方法主要有两种,一种是get方法.还有一种是post方法.两者最大的差别:使用get方法提交的数据会显示在浏览器的地址栏中,而post方法则不会显示,故post方法更为经常使用.表单中提交的数据能够是文本框.列表框及文本区域等. 使用request对象的getParameter()方法可得到表单中对应数据项的值. 下面为"获得表单数据"的代码: <!-- userRegist2.jsp

爬虫模拟登陆之formdata表单数据

首先HTTP协议是个无连接的协议,浏览器和服务器之间是以循环往复的请求回复来交互的,交互的形式是以文件形式来进行的.比如在chrome开发者工具network中看到了 每一行是一个文件,又文件大小啊,文件类型啊,比如脚本,图片等. 根据协议,把每个文件的内容按照协议格式填入HTTP数据协议结构,其中,对于爬虫模拟登陆来说最重要的是表单数据formdata这个字段 在这我们看到又loginname字段,又password字段,我们看到这都是明码,所以做了遮挡.我们得到了这个,就可以根据字段名称自己