aiomysql在tornado中的简单实用

aiomysql库实现了PyMySQL库的异步功能,简单记录下aiomysql在异步框架tornado的简单使用,更详细的使用访问aiomysql官方文档

  • 将链接数据库的信息写在settings中,通过url配置传递给处理类,在初始化类时使用self.db将链接信息设为类全局属性,然后在请求函数中使用。

代码

import aiomysql
from tornado import (
    web,
    ioloop,
)
from tornado.web import (
    RedirectHandler,
    StaticFileHandler
)


class MainHandler(web.RequestHandler):

    def initialize(self, db):
        self.db = db

    async def get(self, *args, **kwargs):
        id = 0
        name = ""
        email = ""
        address = ""
        message = ""

        pool = await aiomysql.create_pool(host=self.db["host"], port=self.db["port"],
                                          user=self.db["user"], password=self.db["password"],
                                          db=self.db["db"], charset="utf8")
        async with pool.acquire() as conn:
            async with conn.cursor() as cur:
                await cur.execute("SELECT id, name, email, address, message from message")
                print(cur.description)
                id, name, email, address, message = await cur.fetchone()
        pool.close()
        await pool.wait_closed()
        return self.render('message.html', id=id, name=name, email=email, address=address, message=message)

    async def post(self, *args, **kwargs):
        id = self.get_body_argument("id", "")
        name = self.get_body_argument("name", "")
        email = self.get_body_argument("email", "")
        address = self.get_body_argument("address", "")
        message = self.get_body_argument("message", "")

        async with aiomysql.create_pool(host=self.db["host"], port=self.db["port"],
                               user=self.db["user"], password=self.db["password"],
                               db=self.db["db"], charset="utf8") as pool:
            async with pool.acquire() as conn:
                async with conn.cursor() as cur:
                    if not id:
                        await cur.execute(
                            "INSERT INTO message(name, email, address, message) VALUES('{}','{}','{}','{}')".format(name,
                                                                                                                    email,
                                                                                                                    address,
                                                                                                                    message))
                    else:
                        await cur.execute("update message set name='{}', email='{}', address='{}', message='{}'".format(name, email, address, message))
                    await conn.commit()
        self.render("message.html", id=id, email=email, name=name, address=address, message=message)


# 如果配置内容过多,可以将配置内容写入字典中然后在启动应用的时候以解包的方式传递使用
settings = {
    # 静态文件路径,即使访问static文件夹下子文件里的静态文件也是可以的
    "static_path": "C:/Users/ZZY/Desktop/code/chapter03/static",
    # 访问静态文件url, 不写默认为/static/
    "static_url_prefix": "/static/",
    # 模板路径配置文件
    "template_path": "templates",
    "db": {
        "host": "127.0.0.1",
        "user": "root",
        "password": "root",
        "db": "my_db",
        "port": 3306
    }
}


if __name__ == '__main__':
    app = web.Application([
        ("/", MainHandler, {"db": settings["db"]}),
        # 访问"/2"时重定向至"/"
        ("/2", RedirectHandler, {"url": "/"}),
        # 访问静态文件,需要传入path
        ("/static/(.*)", StaticFileHandler, {"path": "C:/Users/ZZY/Desktop/code/chapter03/static"}),
    ], debug=True, **settings)  # 解包的方式将settings传递进来
    app.listen(8888)
    ioloop.IOLoop.current().start()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一切如来心秘密

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

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

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

打赏作者

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

抵扣说明:

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

余额充值