Tornado简介:
Tornado是什么
- Tornado是由python开发的Web框架。
Tornado可以做什么
- 利用Tornado可以快速搭建一个高性能的web服务。
Tornado优点是什么
- Tornado是单线程异步的非阻塞服务器,因此速度非常快,相对于一般情况下来说,如果同时连接数Django为3000个左右,那么Tornado为10000个。
Tornado学习如何
- Tornado的学习成本非常低,是个非常容易学习使用的Web框架。
环境搭建:
1.虚拟机环境搭建如之前Django所讲,虚拟机中创建虚拟环境,安装对应的包,这里需要安装pip install tornado;其他和Django一样;
2.在pycharm创建工程有别于Django创建,只需要创建普通python工程即可,然后再配置远程连接,自动同步等如Django前面所讲;
Tornado代码简单例子:
import tornado.ioloop #开启循环,让服务一直等待请求的到来
import tornado.web #web服务基本功能都封装在此模块中
class IndexHandler(tornado.web.RequestHandler): #在这里指定请求的资源,类似Django视图
def get(self):
self.write("Hello Tornado!")
application = tornado.web.Application([ #定义路由表
(r"/",IndexHandler), #根据路由配置,获取什么资源,类似django url配置。
])
if __name__ == "__main__": #当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
application.listen(8000) #创建了一个http服务器示例并绑定到给定端口,用此端口监听
tornado.ioloop.IOLoop.instance().start() #启动IOLoop实例的I/O循环,同时服务器监听被打开。一直运行
路由
在tornado web框架中,路由表中的任意一项是一个元组,每个元组包含pattern(模式)和handler(处理器)。当httpserver接收到一个http请求,server从接收到的请求中解析出url path(http协议start line中),然后顺序遍历路由表,如果发现url path可以匹配某个pattern,则将此http request交给web应用中对应的handler去处理。
由于有了url路由机制,web应用开发者不必和复杂的http server层代码打交道,只需要写好web应用层的逻辑(handler)即可。Tornado中每个url对应的是一个类。
启动Tornado
- tornado支持通过命令行参数来控制启动
import tornado.httpserver
import tornado.ioloop
import tornado.options #从命令行种读取设置
import tornado.web
from tornado.options import define,options
#定义端口为8080
define('port',default=8080,help='run port',type=int)
define('version', default='0.0.1', help='version 0.0.1', type=str)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.write('welcome to index page!')
class LoginHandler(tornado.web.RequestHandler):
def get(self):
self.write('please login!')
app = tornado.web.Application([
(r'/', IndexHandler),
(r'/login', LoginHandler),
])
if __name__ == '__main__':
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(app)
#如果一个与define语句中同名的设置在命令行中被给出,那么它将成为全局的options的一个属性 即 options.port 相当于define的url的port
http_server.listen(options.port) #python test2.py --port=8000 给定了8000端口,覆盖define的
tornado.ioloop.IOLoop.instance().start()
使用 python test2.py --port=8000启动,浏览器输入url
image.png
输入输出
import tornado.httpserver
import tornado.ioloop
import tornado.options #从命令行种读取设置
import tornado.web
from tornado.options import define,options
#定义端口为8080
define('port',default=8080,help='run port',type=int)
define('version', default='0.0.1', help='version 0.0.1', type=str)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
self.write('welcome to index page!') #输出,类似Django中return HttpResponse('test')
class LoginHandler(tornado.web.RequestHandler):
def get(self):
self.write('please login!')
name = self.get_argument('name','') #获取url参数值,如果为空则给默认值,类似Django中request.GET.get("name","")
self.write('<br/>get_argument->name:'+name)
print(name)
name = self.get_arguments('name') #得到参数值的列表,不能给默认值
self.write('<br/>')
self.write('et_argument->names:'+','.join(name)) #将列表通过,拼接返回字符串
print(name)
app = tornado.web.Application([
(r'/', IndexHandler),
(r'/login', LoginHandler),
])
if __name__ == '__main__':
tornado.options.parse_command_line()
http_server = tornado.httpserver.HTTPServer(app)
#如果一个与define语句中同名的设置在命令行中被给出,那么它将成为全局的options的一个属性 即 options.port 相当于define的url的port
http_server.listen(options.port) #python test2.py --port=8000 给定了8000端口,覆盖define的
tornado.ioloop.IOLoop.instance().start()
启动服务:
python test2.py --port=8000
浏览器输入
image.png
总结:
- 路由的定义和作用
- Handler的定义和作用
- 命令行传入参数的方法和方式
- 输入输出,write,get_argument / get_arguments,url传入参数的方法