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