18.Tornado_个人信息案例

1.Tornado_个人信息案例_环境搭建

1.1概述

由于这次是前后端不分离的小型项目案例,就不编写前端代码,前端代码直接展示出来,对应粘贴到template、static的文件夹中即可。

1.2流程概述

  1. 导入前端资源,我已经上传资源到文件夹中咯
  2. 修改person18.html的herf路径,用static_url
  3. VSCode下载Mysql插件
    在这里插入图片描述
  4. 连接数据库,创建数据库tornado_db
  5. 创建表——t_user
    在这里插入图片描述

1.3 环境搭建代码展示

1.3.1 sql创建表

-- Active: 1664001218471@@127.0.0.1@3306@tornado_db
CREATE TABLE t_user(  
    id int PRIMARY KEY AUTO_INCREMENT,
    uname VARCHAR(32),
    nick_name VARCHAR(32),
    email VARCHAR(32),
    pwd VARCHAR(32),
    phone VARCHAR(32),
    language VARCHAR(64)
) COMMENT '';

1.3.2 Tornado

from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop

class IndexHandle(RequestHandler):
    async def get(self):
        self.render('personal18.html')


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
    }
    # 创建Tornado应用
    app = Application([('/',IndexHandle)], **settings)
    # 设置监听端口号
    app.listen(8000)
    IOLoop.current().start()

2.Tornado_整合aiomysql模块

2.1异步操作Mysql方法:

参考链接:如何异步操作mysql

2.2 获取数据库信息——参考2.1,并完成数据回显

将2.1的方法粘贴到get(self)中,并把查询出的结果当成参数传递给;
在html的form表单中绑定数据,让其显示到form表单中

 <input class="au-input au-input--full" type="text" name="username" placeholder="Username" value="{{user[1]}}">

2.3 提取数据库中的参数——展示2.的完整代码

from tornado.web import Application, RequestHandler, URLSpec
from tornado.ioloop import IOLoop
import asyncio
import aiomysql

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('personal20.html',user = rs)


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()

html:

<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <!-- Title Page-->
    <title>个人信息</title>
    <!-- Bootstrap CSS-->
    <link href="{{static_url('css/bootstrap.min.css')}}" rel="stylesheet" media="all">
    <!-- Main CSS-->
    <link href="{{static_url('css/theme.css')}}" rel="stylesheet" media="all">
</head>

<body class="animsition">
    <div class="page-wrapper">
        <div class="page-content--bge5">
            <div class="container">
                <div class="login-wrap">
                    <div class="login-content">
                        <div class="login-logo">
                            <a href="#">
                                <img src="{{static_url('img/logo2.png')}}" alt="CoolAdmin">
                            </a>
                        </div>
                        <div class="login-form">
                            <form action="/" method="post">
                                <div class="form-group">
                                    <label>用户名</label>
                                    <input class="au-input au-input--full" type="text" name="username" placeholder="Username" value="{{user[1]}}">
                                </div>
                                <div class="form-group">
                                    <label>昵称</label>
                                    <input class="au-input au-input--full" type="text" name="nick_name" placeholder="NickName" value="{{user[2]}}">
                                </div>
                                <div class="form-group">
                                    <label>邮箱</label>
                                    <input class="au-input au-input--full" type="email" name="email" placeholder="Email" value="{{user[3]}}">
                                </div>
                                <div class="form-group">
                                    <label>密码</label>
                                    <input class="au-input au-input--full" type="password" name="password" placeholder="Password" value="{{user[4]}}">
                                </div>
                                <div class="form-group">
                                    <label>联系电话</label>
                                    <input class="au-input au-input--full" type="text" name="phone" placeholder="Phone" value="{{user[5]}}">
                                </div>
                                <div class="form-group">
                                    <label>擅长语言</label>
                                    <input class="au-input au-input--full" type="text" name="language" placeholder="Language" value="{{user[6]}}">
                                </div>
                                <button class="au-btn au-btn--block au-btn--green m-b-20" type="submit">确 认</button>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>
<!-- end document-->

3.Tornado_增加数据

3.1流程概述

  1. 获取请求体参数并存放到args中获取参数方法
  2. 链接数据库
  3. 提交sql
  4. 提交事务
  5. 先添加id字段(否则字段长度不够,前端获取会报错),返回模板内容

3.2代码展示

    async def post(self):
        # 获取前端传递来的数据
        name = 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')

        args = [name,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:
                    sql = 'insert into t_user values(0, %s, %s, %s, %s, %s, %s)'
                    await cur.execute(sql, args) 
                    # 提交事务
                    await cur.commit()
                    # 获取生成的id
                    id = con.lastrowid
                    # 存放id到args中
                    args.insert(0,id)
        self.render('personal21.html', user = args)

4.Tornado_修改数据

4.1概述

由于只是案例展示,就不单独开一个路由去做这个业务了。基本的思路就是,先在前端中利用第一步的get请求,去尝试获取用户的id(但不显示),然后返回给后端。后端做一个判断,是否有id这个值存在,如果有,就进行修改,没有就增加数据。

4.2代码展示

from tornado.web import Application, RequestHandler, URLSpec
from tornado.ioloop import IOLoop
import asyncio
import aiomysql

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('personal22.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')
        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('personal22.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()

4.3当没有数据时,前端无法获取的报错问题

只需要在前端的获取数据的value中判断是否存在user即可

4.4代码展示

<!DOCTYPE html>
<html lang="cn">
<head>
    <meta charset="UTF-8">
    <!-- Title Page-->
    <title>个人信息</title>
    <!-- Bootstrap CSS-->
    <link href="{{static_url('css/bootstrap.min.css')}}" rel="stylesheet" media="all">
    <!-- Main CSS-->
    <link href="{{static_url('css/theme.css')}}" rel="stylesheet" media="all">
</head>

<body class="animsition">
    <div class="page-wrapper">
        <div class="page-content--bge5">
            <div class="container">
                <div class="login-wrap">
                    <div class="login-content">
                        <div class="login-logo">
                            <a href="#">
                                <img src="{{static_url('img/logo2.png')}}" alt="CoolAdmin">
                            </a>
                        </div>
                        <div class="login-form">
                            <form action="/" method="post">
                                <div class="form-group">
                                    {% if user %}
                                        <input type="hidden" name="id" value={{user[0]}}>
                                    {% end %}
                                    <label>用户名</label>
                                    <input class="au-input au-input--full" type="text" name="username" placeholder="Username" {% if user %} value={{user[1]}} {% end %}>
                                </div>
                                <div class="form-group">
                                    <label>昵称</label>
                                    <input class="au-input au-input--full" type="text" name="nick_name" placeholder="NickName" {% if user %} value="{{user[2]}}" {% end %}>
                                </div>
                                <div class="form-group">
                                    <label>邮箱</label>
                                    <input class="au-input au-input--full" type="email" name="email" placeholder="Email" {% if user %} value="{{user[3]}}" {% end %}>
                                </div>
                                <div class="form-group">
                                    <label>密码</label>
                                    <input class="au-input au-input--full" type="password" name="password" placeholder="Password" {% if user %} value="{{user[4]}}" {% end %}>
                                </div>
                                <div class="form-group">
                                    <label>联系电话</label>
                                    <input class="au-input au-input--full" type="text" name="phone" placeholder="Phone" {% if user %} value="{{user[5]}}" {% end %}>
                                </div>
                                <div class="form-group">
                                    <label>擅长语言</label>
                                    <input class="au-input au-input--full" type="text" name="language" placeholder="Language" {% if user %} value="{{user[6]}}" {% end %}>
                                </div>
                                <button class="au-btn au-btn--block au-btn--green m-b-20" type="submit">确 认</button>
                            </form>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>
<!-- end document-->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

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

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

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

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

打赏作者

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

抵扣说明:

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

余额充值