python实现从零搭建图书管理系统
【代码】python实现从零搭建图书管理系统。
·
学习目标:
- tornado入门学习
- 异步服务器学习
- 异步数据库操作
一、虚拟环境
1.1 虚拟环境的创建
mkvirtualenv tornado_py3 -p python3
1.2 安装tornado
pip install tornado
1.3 虚拟环境其他的操作
# 虚拟环境
mkvirtualenv # 创建虚拟环境
rmvirtualenv # 删除虚拟环境
workon # 进入虚拟环境、查看所有虚拟环境
deactivate # 退出虚拟环境
# pip
pip install # 安装依赖包
pip uninstall # 卸载依赖包
pip list # 查看已安装的依赖库
二、搭建项目
# 导包
import tornado.ioloop
import tornado.web
# 类似django中视图
class MainHandler(tornado.web.RequestHandler):
# 这里写请求的方式
def get(self):
self.write("Hello, world")
# 程序配置
def make_app():
# 这里配置路由功能
return tornado.web.Application([
(r"/", MainHandler),
])
# 程序入口
if __name__ == "__main__":
# 加载配置
app = make_app()
# 设置监听
app.listen(8888)
# 开启服务, ioloop 实际上是对 epoll 的封装
tornado.ioloop.IOLoop.current().start()
三、完成请求的方式
# 类似django中视图
class MainHandler(tornado.web.RequestHandler):
# 得到数据
def get(self):
# 这里就是返回的内容
self.write("得到数据")
# 添加新的数据
def post(self):
self.write("添加新的数据")
# 修改数据
def put(self):
self.write("修改数据")
# 删除数据
def delete(self):
self.write("删除数据")
四、设置静态文件
# 程序配置
def make_app():
return tornado.web.Application([
(r"/books/", MainHandler),
],
static_path="./static" # 配置静态文件夹路径
)
五、配置模板
5.1 加载模板配置
def make_app():
return tornado.web.Application([
(r"/books/", MainHandler),
],
static_path="./static", # 配置静态文件夹路径
template_path = "./templates",# 配置模板路径
)
5.2 定义模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ show }}</h1>
</body>
</html>
5.3 渲染模板
模板内容使用render返回内容
# 类似django中视图
class MainHandler(tornado.web.RequestHandler):
# 得到数据
def get(self):
# 这里就是返回的内容
self.render("index.html",show='显示内容')
六、加载前端给的数据
6.1 加载前端给个模板文件
6.2 加载前端给的前端静态资源
七、数据库操作
7.1 数据库初始化
-- 创建数据库
create database book_manager charset=utf8;
-- 使用数据库
use book_manager;
-- 创建表
CREATE TABLE books(id int UNSIGNED PRIMARY KEY AUTO_INCREMENT ,btitle VARCHAR(30) not NULL ,bauthor VARCHAR(30) NOT NULL ,bperson VARCHAR(30),bpub_date DATE NOT NULL ,bread INT UNSIGNED,bcomment INT UNSIGNED);
-- 插入数据
insert into books(btitle, bauthor, bperson, bpub_date, bread, bcomment) VALUES
('红楼梦','曹雪芹','宝⽟','1980-5-1',12,34),
('⻄游记','施耐安','悟空','1986-7-24',36,50),
('⽔浒传','吴承恩','林冲','1995-12-24',20,80),
('三国演义','罗贯中','曹操','1980-5-1',58,24);
7.2 安装pymysql
pip install pymysql
八、使用同步的方式操作数据
8.1 get请求
8.1.1get请求处理
class MainHandler(tornado.web.RequestHandler):
# 得到数据
# 异步方法
def get(self):
# 1. 从数据库得到数据
# 1.1连接数据库
# 创建Connection连接
conn = connect(host='localhost', port=3306, database='book_manager', user='root', password='mysql', charset='utf8')
# 获得Cursor对象
cs1 = conn.cursor()
# 1.2 执行查询的sql语句
cs1.execute("select * from books;")
# 得到数据库的数据
data = cs1.fetchall()
# 1.3 关闭
cs1.close()
conn.close()
# 操作
#for temp in data:
# print(temp)
# 返回数据
self.render('index.html',show_list = data)
8.1.2模板数据展示
<!--这里动态添加数据-->
{% for temp in show_list%}
<tr>
<td><input class="idInput" type="text" value="{{temp[0]}}"></td>
<td><input type="text" value="{{temp[1]}}"></td>
<td><input type="text" value="{{temp[2]}}"></td>
<td><input type="text" value="{{temp[3]}}"></td>
<td><input type="text" value="{{temp[4]}}"></td>
<td><input type="text" value="{{temp[5]}}"></td>
<td><input type="text" value="{{temp[6]}}"></td>
<td class="del"><input type="button" value=" 删 除 "></td>
<td class="update"><input type="button" value=" 修 改 "></td>
</tr>
{%end%}
8.2 post请求
def post(self):
# 得到请求的数据
# 使用元组
params_list = list()
params_list.append(self.get_argument('btitle'))
params_list.append(self.get_argument('bauthor'))
params_list.append(self.get_argument('bperson'))
params_list.append(self.get_argument('bpub_date'))
params_list.append(self.get_argument('bread'))
params_list.append(self.get_argument('bcomment'))
print(params_list)
# 1. 从数据库得到数据
# 1.1连接数据库
# 创建Connection连接
conn = connect(host='localhost', port=3306, database='book_manager', user='root', password='mysql',
charset='utf8')
# 获得Cursor对象
cs1 = conn.cursor()
# 1.2 执行查询的sql语句
cs1.execute("insert into books(btitle,bauthor,bperson,bpub_date,bread,bcomment) values(%s,%s,%s,%s,%s,%s)",
params_list)
# 得到数据库的数据
conn.commit()
# 1.3 关闭
cs1.close()
conn.close()
self.write({"data": "success"})
8.3put请求
def put(self):
# 得到数据
body_data = self.request.body.decode("utf-8")
# 解析成字典
params_dict = json.loads(body_data)
# 1. 从数据库得到数据
# 1.1连接数据库
# 创建Connection连接
conn = connect(host='localhost', port=3306, database='book_manager', user='root', password='mysql',
charset='utf8')
# 获得Cursor对象
cs1 = conn.cursor()
# btitle, bauthor, bperson, bpub_date, bread, bcomment
# 1.2 执行查询的sql语句
cs1.execute(
"update books set btitle = %(btitle)s,bauthor = %(bauthor)s,bperson = %(bperson)s,bpub_date =%(bpub_date)s,bread = %(bread)s,bcomment = %(bcomment)s where id = %(id)s",
params_dict
)
# 得到数据库的数据
conn.commit()
# 1.3 关闭
cs1.close()
conn.close()
self.write({"data":"success"})
8.4 delete 请求
def delete(self):
# 得到数据
body_data = self.request.body.decode("utf-8")
# 解析成字典
params_dict = json.loads(body_data)
# 1. 从数据库得到数据
# 1.1连接数据库
# 创建Connection连接
conn = connect(host='localhost', port=3306, database='book_manager', user='root', password='mysql',
charset='utf8')
# 获得Cursor对象
cs1 = conn.cursor()
# 1.2 执行查询的sql语句
cs1.execute("delete from books where id = %(id)s", params_dict)
conn.commit()
# 1.3 关闭
cs1.close()
conn.close()
self.write({"data":"success"})
九、异步请求改造
class MainHandler(tornado.web.RequestHandler):
# 得到数据
# 异步方法
async def get(self):
print('get请求')
# 等待3秒
await asyncio.sleep(3)
# 这里就是返回的内容
self.render("index.html",show='显示内容')
十、异步
10.1 安装模块
pip3 install aiomysql
把所有请求改成异步请求
只需要方法前加async 再耗时返回时使用await返回
class MainHandler(tornado.web.RequestHandler):
# 得到数据
# 异步方法
async def get(self):
# 1. 从数据库得到数据
# 1.1连接数据库
# 创建Connection连接
conn = await aiomysql.connect(host='localhost', port=3306, db='book_manager', user='root', password='mysql',
charset='utf8')
# 获得Cursor对象
cs1 = await conn.cursor()
# 1.2 执行查询的sql语句
await cs1.execute("select * from books;")
# 得到数据库的数据
data = await cs1.fetchall()
# 1.3 关闭
await cs1.close()
conn.close()
# 操作
# for temp in data:
# print(temp)
self.render('index.html', show_list=data)
async def post(self):
# 得到请求的数据
# 使用元组
params_list = list()
params_list.append(self.get_argument('btitle'))
params_list.append(self.get_argument('bauthor'))
params_list.append(self.get_argument('bperson'))
params_list.append(self.get_argument('bpub_date'))
params_list.append(self.get_argument('bread'))
params_list.append(self.get_argument('bcomment'))
print(params_list)
# 1. 从数据库得到数据
# 1.1连接数据库
# 创建Connection连接
conn = await aiomysql.connect(host='localhost', port=3306, db='book_manager', user='root', password='mysql',
charset='utf8')
# 获得Cursor对象
cs1 = await conn.cursor()
# 1.2 执行查询的sql语句
await cs1.execute("insert into books(btitle,bauthor,bperson,bpub_date,bread,bcomment) values(%s,%s,%s,%s,%s,%s)",
params_list)
# 得到数据库的数据
await conn.commit()
# 1.3 关闭
await cs1.close()
conn.close()
self.write({"data": "success"})
async def put(self):
# 得到数据
body_data = self.request.body.decode("utf-8")
# 解析成字典
params_dict = json.loads(body_data)
# 1. 从数据库得到数据
# 1.1连接数据库
# 创建Connection连接
conn = await aiomysql.connect(host='localhost', port=3306, db='book_manager', user='root', password='mysql',
charset='utf8')
# 获得Cursor对象
cs1 = await conn.cursor()
# btitle, bauthor, bperson, bpub_date, bread, bcomment
# 1.2 执行查询的sql语句
await cs1.execute(
"update books set btitle = %(btitle)s,bauthor = %(bauthor)s,bperson = %(bperson)s,bpub_date =%(bpub_date)s,bread = %(bread)s,bcomment = %(bcomment)s where id = %(id)s",
params_dict
)
# 得到数据库的数据
await conn.commit()
# 1.3 关闭
await cs1.close()
conn.close()
self.write({"data": "success"})
async def delete(self):
# 得到数据
body_data = self.request.body.decode("utf-8")
# 解析成字典
params_dict = json.loads(body_data)
# 1. 从数据库得到数据
# 1.1连接数据库
# 创建Connection连接
conn = await aiomysql.connect(host='localhost', port=3306, db='book_manager', user='root', password='mysql',
charset='utf8')
# 获得Cursor对象
cs1 = await conn.cursor()
# 1.2 执行查询的sql语句
await cs1.execute("delete from books where id = %(id)s", params_dict)
await conn.commit()
# 1.3 关闭
await cs1.close()
conn.close()
self.write({"data":"success"})
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献40条内容
所有评论(0)