33.Tornado_wtform数据验证

1.Tornado_wtform介绍

WTForms是用于Python Web开发的灵活的表单验证喝呈现库。他可以和任何的web框架和模板引擎一起使用。
现在因为前后端分离的原因,一般只用于表单的验证,模板渲染的功能基本不再使用。

2.为什么要表单数据验证

其实前端也是可以进行数据验证,但由于前后端分离的原因,还是在后端进一步验证可以保证传入到的数据合法。

3.安装

pip install wtforms-tornado

4.使用方式

  1. 创建表单类
    1. 需要继承wtforms_tornado.Form
    2. 定义字段类型
    - 可以使用wtforms.fields引入
    3. 定义验证规则
    - 可以使用wtforms.validators引入
  2. 创建表单对象
  3. 调用表单验证方法

5.Tornado_wtform数据验证

这里将使用原先的写过的个人信息填写,对其进行添加数据验证功能
个人信息案例原网址

5.1错误信息解决:

ImportError: cannot import name ‘compat’ from ‘wtforms’

  1. wtforms===3.0.1 删除 pip uninstall wtforms
  2. 下载旧版本pip install wtforms==2.3.3

5.2代码展示

from wtforms34 import UserForm
        # 建立表单对象
        uf = UserForm(self.request.arguments)
        # 验证
        if not uf.validate():# 成功:true 失败:false
            import json
            data = json.dumps(uf.errors, ensure_ascii=False)
            self.write(data)

表单验证规则:

from wtforms_tornado import Form
from wtforms.fields import IntegerField, StringField
from wtforms.validators import DataRequired, Length

# 创建一个表单类
class UserForm(Form):
    # 定义字段:注意 验证字段的名字一定要和前端传递来的名字保持一致
    # 编写规则
    id = IntegerField('ID')
    username = StringField('用户名',validators=(DataRequired(message='请填写用户名'),Length(min=3,max=10,message='请输入3-10位的用户名')))
    nick_name = StringField('昵称')
    email = StringField('邮箱')
    password = StringField('密码')
    phone = StringField('电话')
    language = StringField('语言')

6.完整代码

from tornado.web import Application, RequestHandler, URLSpec
from tornado.ioloop import IOLoop
import asyncio
import aiomysql
# 引入
from wtforms34 import UserForm

class IndexHandle(RequestHandler):
    # 首先由Application创建路由地址时,携带参数传递会到initialize,去定义一个self.mysql用于get中获取参数
    def initialize(self,mysql):
        self.mysql = mysql

    async def get(self):
        print(self.mysql)
        # 获取1个客户端链接池
        async with aiomysql.create_pool(
            host=self.mysql.get('host'),
            port=self.mysql.get('port'),
            user=self.mysql.get('user'),
            password=self.mysql.get('pwd'),
            db=self.mysql.get('db')) as pool:
            # 获取1个链接,用来获取游标
            async with pool.acquire() as con:
                # 获取一个游标,用来操作数据库
                async with con.cursor() as cur:
                    # 执行sql
                    # sql = 'select 101'
                    sql = 'select * from t_user'
                    await cur.execute(sql)
                    # 获取结果
                    rs = await cur.fetchone()
                    print(rs)
        self.render('personal34.html',user = rs)
    
    
    

    async def post(self):
        # 获取前端传递来的数据
        uname = self.get_argument('username')
        nick_name = self.get_body_argument('nick_name')
        email = self.get_argument('email')
        password = self.get_body_argument('password')
        phone = self.get_argument('phone')
        language = self.get_body_argument('language')

        # 建立表单对象
        uf = UserForm(self.request.arguments)
        # 验证
        if not uf.validate():# 成功:true 失败:false
            import json
            data = json.dumps(uf.errors, ensure_ascii=False)
            self.write(data)
        else:
            try:
                # 获取id
                id = self.get_body_argument('id')
            except Exception as e:
                id = False

            args = [uname,nick_name,email,password,phone,language]
            # 链接数据库
            # 获取1个客户端链接池
            async with aiomysql.create_pool(
                host=self.mysql.get('host'),
                port=self.mysql.get('port'),
                user=self.mysql.get('user'),
                password=self.mysql.get('pwd'),
                db=self.mysql.get('db')) as pool:
                # 获取1个链接,用来获取游标
                async with pool.acquire() as con:
                    # 获取一个游标,用来操作数据库
                    async with con.cursor() as cur:
                        if not id:
                            sql = 'insert into t_user values(0, %s, %s, %s, %s, %s, %s)'
                            await cur.execute(sql, args) 
                            # 提交事务
                            await con.commit()
                            # 获取生成的id
                            id = cur.lastrowid
                        else:
                            sql = 'update t_user set uname=%s, nick_name=%s, email=%s, pwd=%s, phone=%s, language=%s where id=%s'
                            # 增加id来告诉数据库更新哪一条数据
                            args.append(id)
                            await cur.execute(sql, args)
                            await con.commit()
                        # 存放id到args中
                        args.insert(0,id)
            self.render('personal34.html', user = args)



if __name__ == '__main__':
    import os
    # 获取绝对路径
    base_path = os.path.abspath(os.path.dirname(__file__))
    # 设置应用参数
    settings = {
        'template_path':os.path.join(base_path, 'templates'),
        'static_path': os.path.join(base_path, 'static'),
        'static_url_prefix': '/static/',
        'debug': True,
        # 为了方便数据库的修改,可以直接把参数单独放在这
        'mysql': {
            'host': '127.0.0.1',
            'port': 3306,
            'user': 'root',
            'pwd': 'root',
            'db': 'tornado_db'
        }
    }
    # 创建Tornado应用
    app = Application([
        URLSpec('/',IndexHandle, {'mysql':settings.get('mysql')})
        ], **settings)
    # 设置监听端口号
    app.listen(8000)
    IOLoop.current().start()


'''
错误信息解决:
ImportError: cannot import name 'compat' from 'wtforms'

wtforms===3.0.1 删除 pip uninstall wtforms

下载旧版本pip install wtforms==2.3.3
'''
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想成为数据分析师的开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值