Tornado是Python编写的Web服务器兼Web应用框架。
优势:
- 轻量级web框架
- 异步非阻塞IO处理方式
- 出色的抗负载能力
- 优异的处理性能,不依赖多进程/多线程,一定程度上解决了C10K问题
- WSGI全栈替代产品,推荐同时使用其Web框架和HTTP服务器
一、Tornado 安装
pip3 install tornado
# 引入tornado模块
import tornado.ioloop
import tornado.web
二、创建一个应用对象,定义路由表
# 创建一个应用对象
application = tornado.web.Application([
# 定义路由表
(r"/", MainHandler), # MainHandler为路径对应的业务逻辑类
])
三、定义服务、监听端口、启动服务(以多进程操作为例)
server = tornado.httpserver.HTTPServer(application) # 定义服务
server.bind(port) # port为你要监听的端口号
server.start(processNum) # 程序的进程数
tornado.ioloop.IOLoop.current().start() # tornado.ioloop.IOLoop.current()就是默认的tornado ioloop实例。
四、开发业务逻辑类
在业务逻辑类中,需要实现get或post方法,即提供给前端调用的API。
# 实现业务逻辑类
class MainHandler(tornado.web.RequestHandler):
# 定义get请求方法
def get(self):
# 返回响应数据
self.write("hello world")
完整示例:
import tornado.ioloop
import tornado.web
# 定义业务逻辑类
class MainHandler(tornado.web.RequestHandler):
# 定义一个处理get请求方式的方法
def get(self):
# 返回数据
self.write("Hello, world")
def main():
# 创建一个应用对象
application = tornado.web.Application([
# 路由表
(r"/", MainHandler),
])
server = tornado.httpserver.HTTPServer(application) # 定义服务
server.bind(8080) # port为你要监听的端口号
server.start(0) # 程序的进程数
tornado.ioloop.IOLoop.current().start() # tornado.ioloop.IOLoop.current()就是默认的tornado ioloop实例。
if __name__ == "__main__":
main()
在终端执行上面的示例代码:python main.py
然后在浏览器中访问localhost:8080/
就可以在页面上看到hello,world
五、参数处理
上面我们通过一个简单的示例,展示了如何在一个业务逻辑类中实现一个get接口,而且这个get接口没有接受任何的参数,但在实际的开发应用中,每个接口都需要接受参数和返回结果。
get方式传递参数(查询字符串参数)
get_query_arguments(name,default=_ARG_DEFAULT,strip=True)
get_query_argument(name ,strip=True)
- 从请求的查询字符串中返回指定参数name的值。
- default为设值未传name参数时返回的默认值,如若default也未设置,则会抛出tornado.web.MissingArgumentError异常。
- strip表示是否过滤掉左右两边的空白字符,默认为过滤。(当传送密码时可以将strip设置为False)
示例:
# -*- coding:utf-8 -*-
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer
class IndexHandler(RequestHandler):
def get(self):
# 获取get方式传递的参数
username = self.get_query_argument("username")
usernames = self.get_query_arguments("username")
print (username)
print (usernames)
if __name__ == "__main__":
app = Application([(r"/",IndexHandler)])
app.listen(8000)
IOLoop.current().start()
测试代码:test.py
为了方便测试,我们另外写了一个脚本程序来模拟浏览器操作:
import requests
import json
def get_test():
url = 'http://localhost:8000/?username=123'
res = requests.get(url)
print(res.status_code)
if __name__ == '__main__':
get_test()
先运行服务端程序,在运行测试脚本,如果返回200,则说明访问成功。服务端会输出123,[123,]
post方式传递参数
get_body_arguments(name, default=_ARG_DEFAULT,strip=True)
get_body_argument(name ,strip=True)
- 从请求体中返回指定参数name的值。default与strip同前,不再赘述。
说明
对于请求体中的数据要求为字符串,且格式为表单编码格式(与url中的请求字符串格式相同),即key1=value1&key2=value2,HTTP报文头Header中的"Content-Type"为application/x-www-form-urlencoded 或 multipart/form-data。对于请求体数据为json或xml的,无法通过这两个方法获取。
示例:服务端代码
# -*- coding:utf-8 -*-
from tornado.web import Application, RequestHandler
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer
class IndexHandler