Tornado
是一个Python Web
框架和异步网络库,起初由FriendFeed
开发,通过使用非阻塞网络I/O
,Tornado
可以支撑上万级的连接,处理长连接,WebSockets
和其他需要与每个用户保持长久连接的应用。
编写第一个Tornado
程序
首先创建Tornado
工程,tornado_demo
,在该工程下创建一个hello.py
文件。
输入以下代码:
1 | import tornado.ioloop # 主事件循环模块 |
然后在cmd
控制台中运行该脚本。
可以看到该Tornado
项目已经运行起来了。
在浏览器中输入http://127.0.0.1:8888/
即可访问Web
界面。
这样我们的第一个Tornado
项目就创建好了,在指定端口下可以访问当index页面。
其中:
ioloop
是主事件循环模块。web是WEB
框架模块MainHandler
类用于处理用户请求。make_app
函数,用于创建Tornado
应用,并设置路由信息。debug=True
表示进入调试模式,每次修改代码后会重启服务。在创建好应用后,还需要指定监听的端口,调用其listen()
方法。
设置多个路由
前面我们已经创建了一个简单的Tornado
项目,在网页根目录上输出Hello world
。
能够输出该内容是因为我们在make_app
函数中设置了路由对应规则,将根目录'/'
,对应到了MainHandler
类,在访问根目录的时候就会调用MainHandler
类中的get
方法给用户返回相应的页面内容。
但是一个Web
项目不可能只有单个页面,当出现多个页面的时候如何进行处理呢?这个时候就需要设置多条路由规则,将不用的页面内容对应到不同的Handler
类,处理不同的任务。
例如,我们再定义一个/index
路由规则。
此时只需要做两个改动。
- 增加一个
IndexHandler
类。
1 | class IndexHandler(tornado.web.RequestHandler): |
- 在
make_app
中设置路由
1 | def make_app(): |
- 访问:
http://127.0.0.1:8888/index
同时路由规则还支持使用正则表达式进行匹配。
修改路由让路径
http://127.0.0.1:8888/re/REa
、http://127.0.0.1:8888/re/REb
、http://127.0.0.1:8888/re/REc
、http://127.0.0.1:8888/re/REd
均返回MainHandler
。修改
make_app
代码如下:1
2
3
4
5
6
7
8def make_app():
"""创建tornado应用,设置相关路由信息"""
return tornado.web.Application([
(r"/", MainHandler), # 设置路由
(r"/index", IndexHandler),
(r"/re/RE[abcd]", MainHandler)
],
debug=True)访问
http://127.0.0.1:8888/re/REa
、http://127.0.0.1:8888/re/REb
、http://127.0.0.1:8888/re/REc
、http://127.0.0.1:8888/re/REd
发现均返回以下页面。
HTTP方法
Tornado
同样支持各种请求,请求需要在Handler
中进行定义,继承自tornado.web.RequestHander
父类。
RequestHander
提供了如下方法:
RequestHander.get(*args, **kwargs)
RequestHander.head(*args, **kwargs)
RequestHander.post(*args, **kwargs)
RequestHander.delete(*args, **kwargs)
RequestHander.patch(*args, **kwargs)
RequestHander.put(*args, **kwargs)
RequestHander.options(*args, **kwargs)
所以,只需要在自定义的操作类中创建对应方法,即可实现增删改查等功能。
例如:创建一个既可以接收GET
请求,又可以接收POST
请求的LoginHander
类,代码如下:
1 | class LoginHander(tornado.web.RequestHandler): |
在make_app
中添加路由信息:
1 | def make_app(): |
- 访问
http://127.0.0.1:8888/login
可以发现get请求成功。
然后打开一个cmd
终端,测试post
请求,输入以下代码:
1 | curl -d "username=minglog&password=123456" "http://127.0.0.1:8888/login" |
返回结果:
发现post请求成功
模板
前面我们响应的结果都是简单的文字,在实际需求中仅仅返回文字内容肯定是不够的,我们一般会返回相对应的HTML页面内容,返回的HTML页面内容我们称为模板文件。
使用模板时,需要先在应用中设置template_path
模板路径【在make_app
函数中设置template_path
的值,一般设置为当前工程路径下的templates
文件夹】,然后使用render()
方法渲染模板。
设置模板路径
1 | def make_app(): |
创建templates
文件夹,并编写模板文件
模板文件代码如下:
1 |
|
修改LoginHander
为了让响应返回指定的模板文件,需要对前面的LoginHander
类中的get
方法进行相应的修改,让其返回login.html
页面。
1 | class LoginHander(tornado.web.RequestHandler): |
测试结果
- 再次访问
http://127.0.0.1:8888/login
- 输入用户名和密码,点击登录。
发现可以直接返回我们输入的内容。