循环模块
tornado的核心io循环模块,封装了Linux的epoll和BSD的kqueue,tornado高性能的基石。 以Linux的epoll为例,其原理如下图:
IOLoop.current() 返回当前线程的IOLoop实例。
IOLoop.start() 启动IOLoop实例的I/O循环,同时服务器监听被打开。
小结:
1. tornado高性能Web原理是利用Linux epoll IO多路模型和协程异步编程
2. tornado Web框架核心模块是 web 和 核心事件循环模块是 IOLoop
1.3基础应用
上面的例子是get请求,下面我们再来看一下post请求如何做
Post请求
import tornado
from tornado import ioloop,httpserver
from tornado.web import RequestHandler,url
from tornado.options import define,options
tornado.options.define("port",type=int,default=8002,help="服务器客户端")
class IndexHandler(RequestHandler):
def post(self):
# a = self.get_body_arguments("a")
a = self.get_body_argument("a")
print(a)
self.write("a的值为%s"%a)
#入口文件
if __name__ == '__main__':
tornado.options.parse_command_line()
app = tornado.web.Application([(r"/",IndexHandler),],
debug=True)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
使用RequestHandler对象的get_argument方法来捕获请求查询字符串的的参数。
get_argument可以获取post请求和get请求的全部参数。
get_query_argument获取get请求的所有参数。
get_body_argument获取get请求的所有参数。
这里需要注意的是上面的三个方法如果遇到相同的查询字符串,会以最后查询到的字符串值为结果。
这里返回的是最后一个a的值,大家可能会有一问,如果我想获取所有a的值,改怎么做呢。
很简单,上面代码中有个方法我给注释了,没错,就是get_body_arguments,方法会返回所有的a的结果数组。
Post发送json请求
在tornado中post请求接收的参数只允许使用两种格式
但是如果想发送json请求,我们就需要自定义解析json文件的过程
# coding:utf-8
import tornado
from tornado import ioloop,httpserver
from tornado.web import RequestHandler,url
from tornado.options import define,options
import json,time
tornado.options.define("port",type=int,default=8002,help="服务器客户端")
class IndexHandler(RequestHandler):
def post(self):
#json请求 解析
if self.request.headers.get("Content-Type").startswith("application/json"): #判断请求格式
json_data = self.request.body #获取请求json
json_data = str(json_data,'utf-8') #转换字符串
json_args = json.loads(json_data) #转换字典
self.write(json_args)
#入口文件
if __name__ == '__main__':
tornado.options.parse_command_line()
app = tornado.web.Application([(r"/",IndexHandler),
],
debug=True)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.current().start()
request.headers.get方法用来获取报头信息,request.body获取body。
结果:
Post请求上传文件
import tornado
from tornado import ioloop, httpserver
from tornado.web import RequestHandler, url
from tornado.options import define, options
import json, time
tornado.options.define("port", type=int, default=8002, help="服务器客户端")
class IndexHandler(RequestHandler):
def post(self):
# 上传文件
image1 = self.request.files["image1"][0]["body"]
with open("image1.jpg",'wb')as f: #文件保存
f.write(image1)
f.close()
self.write("上传成功")
# 入口文件
if __name__ == '__main__':
tornado.options.parse_command_line()
app = tornado.web.Application([(r"/", IndexHandler)
],
debug=True)
http_server = tornado.httpserver.HTTPServer(app)
http_server.list