学习目标tornado入门学习异步服务器学习异步数据库操作一、虚拟环境1。1虚拟环境的创建mkvirtualenvtornadopy3ppython31。2安装tornadopipinstalltornado1。3虚拟环境其他的操作虚拟环境mkvirtualenv创建虚拟环境rmvirtualenv删除虚拟环境workon进入虚拟环境、查看所有虚拟环境deactivate退出虚拟环境pippipinstall安装依赖包pipuninstall卸载依赖包piplist查看已安装的依赖库二、搭建项目 三、完成请求的方式类似django中视图classMainHandler(tornado。web。RequestHandler):得到数据defget(self):这里就是返回的内容self。write(得到数据)添加新的数据defpost(self):self。write(添加新的数据)修改数据defput(self):self。write(修改数据)删除数据defdelete(self):self。write(删除数据)四、设置静态文件程序配置defmakeapp():returntornado。web。Application(〔(rbooks,MainHandler),〕,staticpath。static配置静态文件夹路径)五、配置模板5。1加载模板配置defmakeapp():returntornado。web。Application(〔(rbooks,MainHandler),〕,staticpath。static,配置静态文件夹路径templatepath。templates,配置模板路径)5。2定义模板!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8titleTitletitleheadbodyh1{{show}}h1bodyhtml5。3渲染模板 模板内容使用render返回内容类似django中视图classMainHandler(tornado。web。RequestHandler):得到数据defget(self):这里就是返回的内容self。render(index。html,show显示内容)六、加载前端给的数据6。1加载前端给个模板文件6。2加载前端给的前端静态资源七、数据库操作7。1数据库初始化创建数据库createdatabasebookmanagercharsetutf8;使用数据库usebookmanager;创建表CREATETABLEbooks(idintUNSIGNEDPRIMARYKEYAUTOINCREMENT,btitleVARCHAR(30)notNULL,bauthorVARCHAR(30)NOTNULL,bpersonVARCHAR(30),bpubdateDATENOTNULL,breadINTUNSIGNED,bcommentINTUNSIGNED);插入数据insertintobooks(btitle,bauthor,bperson,bpubdate,bread,bcomment)VALUES(红楼梦,曹雪芹,宝,198051,12,34),(游记,施耐安,悟空,1986724,36,50),(浒传,吴承恩,林冲,19951224,20,80),(三国演义,罗贯中,曹操,198051,58,24);7。2安装pymysql pipinstallpymysql八、使用同步的方式操作数据8。1get请求 8。1。1get请求处理classMainHandler(tornado。web。RequestHandler):得到数据异步方法defget(self):1。从数据库得到数据1。1连接数据库创建Connection连接connconnect(hostlocalhost,port3306,databasebookmanager,userroot,passwordmysql,charsetutf8)获得Cursor对象cs1conn。cursor()1。2执行查询的sql语句cs1。execute(selectfrombooks;)得到数据库的数据datacs1。fetchall()1。3关闭cs1。close()conn。close()操作fortempindata:print(temp)返回数据self。render(index。html,showlistdata) 8。1。2模板数据展示!这里动态添加数据{fortempinshowlist}trtdinputclassidInputtypetextvalue{{temp〔0〕}}tdtdinputtypetextvalue{{temp〔1〕}}tdtdinputtypetextvalue{{temp〔2〕}}tdtdinputtypetextvalue{{temp〔3〕}}tdtdinputtypetextvalue{{temp〔4〕}}tdtdinputtypetextvalue{{temp〔5〕}}tdtdinputtypetextvalue{{temp〔6〕}}tdtdclassdelinputtypebuttonvalue删除tdtdclassupdateinputtypebuttonvalue修改tdtr{end}8。2post请求defpost(self):得到请求的数据使用元组paramslistlist()paramslist。append(self。getargument(btitle))paramslist。append(self。getargument(bauthor))paramslist。append(self。getargument(bperson))paramslist。append(self。getargument(bpubdate))paramslist。append(self。getargument(bread))paramslist。append(self。getargument(bcomment))print(paramslist)1。从数据库得到数据1。1连接数据库创建Connection连接connconnect(hostlocalhost,port3306,databasebookmanager,userroot,passwordmysql,charsetutf8)获得Cursor对象cs1conn。cursor()1。2执行查询的sql语句cs1。execute(insertintobooks(btitle,bauthor,bperson,bpubdate,bread,bcomment)values(s,s,s,s,s,s),paramslist)得到数据库的数据conn。commit()1。3关闭cs1。close()conn。close()self。write({data:success})8。3put请求defput(self):得到数据bodydataself。request。body。decode(utf8)解析成字典paramsdictjson。loads(bodydata)1。从数据库得到数据1。1连接数据库创建Connection连接connconnect(hostlocalhost,port3306,databasebookmanager,userroot,passwordmysql,charsetutf8)获得Cursor对象cs1conn。cursor()btitle,bauthor,bperson,bpubdate,bread,bcomment1。2执行查询的sql语句cs1。execute(updatebookssetbtitle(btitle)s,bauthor(bauthor)s,bperson(bperson)s,bpubdate(bpubdate)s,bread(bread)s,bcomment(bcomment)swhereid(id)s,paramsdict)得到数据库的数据conn。commit()1。3关闭cs1。close()conn。close()self。write({data:success})8。4delete请求defdelete(self):得到数据bodydataself。request。body。decode(utf8)解析成字典paramsdictjson。loads(bodydata)1。从数据库得到数据1。1连接数据库创建Connection连接connconnect(hostlocalhost,port3306,databasebookmanager,userroot,passwordmysql,charsetutf8)获得Cursor对象cs1conn。cursor()1。2执行查询的sql语句cs1。execute(deletefrombookswhereid(id)s,paramsdict)conn。commit()1。3关闭cs1。close()conn。close()self。write({data:success})九、异步请求改造classMainHandler(tornado。web。RequestHandler):得到数据异步方法asyncdefget(self):print(get请求)等待3秒awaitasyncio。sleep(3)这里就是返回的内容self。render(index。html,show显示内容)十、异步10。1安装模块pip3installaiomysql把所有请求改成异步请求 只需要方法前加async再耗时返回时使用await返回classMainHandler(tornado。web。RequestHandler):得到数据异步方法asyncdefget(self):1。从数据库得到数据1。1连接数据库创建Connection连接connawaitaiomysql。connect(hostlocalhost,port3306,dbbookmanager,userroot,passwordmysql,charsetutf8)获得Cursor对象cs1awaitconn。cursor()1。2执行查询的sql语句awaitcs1。execute(selectfrombooks;)得到数据库的数据dataawaitcs1。fetchall()1。3关闭awaitcs1。close()conn。close()操作fortempindata:print(temp)self。render(index。html,showlistdata)asyncdefpost(self):得到请求的数据使用元组paramslistlist()paramslist。append(self。getargument(btitle))paramslist。append(self。getargument(bauthor))paramslist。append(self。getargument(bperson))paramslist。append(self。getargument(bpubdate))paramslist。append(self。getargument(bread))paramslist。append(self。getargument(bcomment))print(paramslist)1。从数据库得到数据1。1连接数据库创建Connection连接connawaitaiomysql。connect(hostlocalhost,port3306,dbbookmanager,userroot,passwordmysql,charsetutf8)获得Cursor对象cs1awaitconn。cursor()1。2执行查询的sql语句awaitcs1。execute(insertintobooks(btitle,bauthor,bperson,bpubdate,bread,bcomment)values(s,s,s,s,s,s),paramslist)得到数据库的数据awaitconn。commit()1。3关闭awaitcs1。close()conn。close()self。write({data:success})asyncdefput(self):得到数据bodydataself。request。body。decode(utf8)解析成字典paramsdictjson。loads(bodydata)1。从数据库得到数据1。1连接数据库创建Connection连接connawaitaiomysql。connect(hostlocalhost,port3306,dbbookmanager,userroot,passwordmysql,charsetutf8)获得Cursor对象cs1awaitconn。cursor()btitle,bauthor,bperson,bpubdate,bread,bcomment1。2执行查询的sql语句awaitcs1。execute(updatebookssetbtitle(btitle)s,bauthor(bauthor)s,bperson(bperson)s,bpubdate(bpubdate)s,bread(bread)s,bcomment(bcomment)swhereid(id)s,paramsdict)得到数据库的数据awaitconn。commit()1。3关闭awaitcs1。close()conn。close()self。write({data:success})asyncdefdelete(self):得到数据bodydataself。request。body。decode(utf8)解析成字典paramsdictjson。loads(bodydata)1。从数据库得到数据1。1连接数据库创建Connection连接connawaitaiomysql。connect(hostlocalhost,port3306,dbbookmanager,userroot,passwordmysql,charsetutf8)获得Cursor对象cs1awaitconn。cursor()1。2执行查询的sql语句awaitcs1。execute(deletefrombookswhereid(id)s,paramsdict)awaitconn。commit()1。3关闭awaitcs1。close()conn。close()self。write({data:success})