范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

python实现从零搭建图书管理系统

  学习目标 tornado入门学习 异步服务器学习 异步数据库操作 一、虚拟环境1.1 虚拟环境的创建mkvirtualenv tornado_py3 -p python31.2 安装tornadopip install tornado1.3 虚拟环境其他的操作# 虚拟环境 mkvirtualenv  # 创建虚拟环境 rmvirtualenv  # 删除虚拟环境 workon  # 进入虚拟环境、查看所有虚拟环境 deactivate  # 退出虚拟环境  # pip pip install  # 安装依赖包 pip uninstall  # 卸载依赖包 pip list  # 查看已安装的依赖库二、搭建项目
  三、完成请求的方式# 类似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 定义模板            Title       

{{ show }}

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%} {%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"})

罗永浩细红线公司注册资本增至1亿元变为外国法人独资Tech星球1月9日消息,近日,北京细红线科技有限公司发生多项工商变更,注册资本由10万元增至1亿元冯遥遥卸任法定代表人执行董事,由王威接任大股东变更为ALWAYSONTECHPT大数据扫黄要来了,有这几个特征的要注意随着科技的不断发展,互联网也逐渐介入人们的生活。在几十年前,甚至是十几年前,我们国家科技非常落后,人们的生活不方便。但是随着科技日新月异的发展,这一切也都变了。人们开始学习怎么使用有人认为有些科学家和数学家因发现了宇宙真谛而自杀,是真的吗?在回答问题之前我们先来探讨一下,什么是宇宙的真谛?这个问题迄今没有人能给出答案,虽然人类已经历经了百万年的进化,数学也一直伴随人类左右,成为推动人类社会发展的基石,但物理学却是一个盘点屏幕采用E5发光材料的手机,共21款1小米12Pro搭载全新一代骁龙8旗舰处理器,采用三星4nm制程工艺,图像处理能力AI性能等再次进化,拥有卓越的性能,但功耗也高,发热非常严重正面是一块6。73英寸的三星E5发光材计算摄影对决大底硬件,VIVOX90PP与华为iPhone的终极PK!如今手机厂商都在卷影像,谁家不推出个大底硬件不来个潜望长焦不联名个知名相机品牌,都不好意思将自家的影像作为卖点。但有两个大品牌却还是特立独行,不追求极致的硬件,也不做联名,而是将计亚马逊首次公开店铺的封店标准!前段时间,有个劲爆新闻,不知道大家还记不记得,就是亚马逊当时宣布为第三方卖家推出了一个免死计划。这个免死计划的名字是账户状况保障计划,英文名字是AccountHealthAssur世预赛44人惨遭淘汰!多次出现111比分,国乒单打开门红北京时间1月8日晚,德班世乒赛亚洲区预选赛结束了第二个比赛日的战斗,目前已有44人在单打项目中惨遭淘汰出局,期间更是多次出现小比分110111的情况,由此可见大家的水平差距的确非常麦迪詹姆斯对比赛理解强于我,攻防方面不如我,未夺冠因队友差篮球之角逐在于个人能力更在于阵容,乔丹在没有皮蓬的时候也苦苦挣扎了好几年科比在鲨鱼东游和加索尔尚未加入的时候也是独木难支詹姆斯尚未前往迈阿密的时候,总冠军的滋味也未曾品尝到对此麦迪张桂梅即便暂时迷茫,也要努力发光新的一年要来了。张桂梅老师受邀写了一封信,现刊出,分享给广大读者。信中,张桂梅老师分享了自己人生旅程中的故事曾经在寒冷中,她感受到了别人给予的温暖,她铭记一生,并努力想把它传递下去强烈建议手机厂商让tf卡扩展功能回归!挽回安卓手机销量颓势!内存卡扩展功能多实用想必也不必多说,安卓手机诞生之日就有了,换手机导数据也方便,还有就是这样的手机不得不说太环保了,手机厂商环保喊的震天响,付诸行动就不行了,真的是为人不齿,现如今蚂蚁集团强化与阿里隔离马云不再是实际控制人iPhone15Pro将独占6大功能Linux4。9正式EOL极客头条CSDN的读者朋友们早上好哇,极客头条来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。整理梦依丹出品CSDN(IDCSDNnews)一分钟速览新闻点!李彦宏内部反思马化腾内
真实经历游客深夜独闯诡异城市公园,险被动物袭击,狼狈逃离标题里说的这位游客,就是我自己。当时也不知道为啥,非要半夜三更一个人跑到这座诡异的公园里,整个过程充满好奇刺激,但突如其来的惊吓还是让人猝不及防,以至于落荒而逃布里斯班植物公园内澳最新官宣!2023林芝桃花节,峡谷桃醉,开启西藏寻花之旅人间四月芳菲尽,山寺桃花始盛开图源波密县文旅局印度洋的暖湿气流和千年的峡谷桃源相逢粉红色的浪漫终于渲染着中国版图迸溅在雪域高原林芝的漫山遍野桃花,已次第开放图源西藏米林文旅原来在西广西东兴口岸恢复客运功能新京报讯(记者吴采倩)2月21日,新京报记者从广西东兴市商务和口岸管理局获悉,今日东兴口岸已经恢复客运功能,出入境人员如实填报出入境健康申明卡,持商务签证或者边民证即可通关。此外,国内直飞巴厘岛往返1800元?机票搜索量增长了3。7倍记者薛冰冰2月21日,厦门巴厘岛复航往返1800元的词条冲上微博热搜榜。消息称,近日厦门航空公布了3月1日3月25日航班计划,厦门到旅游胜地巴厘岛复航。在去哪儿平台上,厦门往返巴厘探索沙雕的文明起源,了解欧洲沙雕的小妙招,这可太有意思了沙雕的含义沙雕艺术源于100多年前的美国,在20世纪80年代发展成为一门现代艺术,它是一项融雕塑文化绘画建筑体育娱乐于一体的国际前沿边缘艺术,具有独特的震撼性真实性参与性时限性等特关于青海,这些冷知识你都知道几个?青海位于中国西部,世界屋脊青藏高原的东北部,与甘肃四川西藏新疆接壤,共有2个地级市,6个民族自治州。总面积72。10万平方公里,人口有594万人,省会西宁。1青海的旅馆没有空调,因后冬奥时代,长春市南湖公园释放人们冰雪情怀从2月20日开始,随着气温回升,天气逐渐转暖,长春市南湖公园陆续撤掉冬季冰面上的娱乐项目。此时,距离2022年北京冬奥会闭幕已过去整整一年的时间,但20222023的雪季里,后冬奥禁女宠,贬外戚浅析女官制度对明朝的影响阅读此文前,请动动手指点点右上方的关注,后续我们会为您带来更多优质内容,方便您及时阅读,感谢您的支持。前言对生活在封建时代,无法像男子那般登科入仕的女性来说,成为一名女官也许就是她站在巨人肩膀上的吴起变法为何只持续了一年就被迫流产战国时期第二个发起改革的诸侯国是楚国,楚悼王时期,楚国任用吴起主持变法。但是短短一年时间,变法就宣告了失败,为何吴起变法会在这么短的时间内失败?吴起变法对楚国有没有实质性的提升?吴开国皇帝身上必备的素质中华文明上下五千年博大精深,有很多领域值得我们去发掘。今天先聊聊历代开国皇帝自身的光环百折不挠的素质。刘邦VS项羽剧照汉高祖刘邦为何能够在楚汉争霸中脱颖而出,最关键的一点是刘邦身上明末的老百姓有多惨?很多人都有一个疑惑,大明王朝上亿的人口,为何会打不过满清10万铁骑。而为何一个陕西的天灾,竟最后让大明亡国。看了以下内容,很多问题就会有了答案。01hr万历四十四年,公元1616年