Tornado
Tornado
是使用Python
编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。
Python Web
框架有三 Django、Flask、Tornado
其中 Tornado
是唯一一个异步框架.
我也是第一次用 Tornado
之前都是在用 Flask
,但是没办法啊,项目用的是 Tornado
,学啊学啊学啊学,好好学习,天天向上。
初入Tornado
创建一个启动实例
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
# tornado.options 可以从命令行中读取设置,如果指定参数,则在代码中定义的将会被替代.
define('port', default=8000, type=int) # 监听HTTP请求的端口,也可以监听命令行的输入的参数,type代表输入参数的类型
class IndexHandler(tornado.web.RequestHandler): # Tornado在处理请求时,将类实例化,并调用与HTTP请求方法对应的方法.
def get(self): # 只定义了get方法,只对HTTP的GET请求作出相应.
greeting = self.get_argument('greeting', 'Hello') # 查询字符串中取得参数greeting的值,不存在就是第二个值.
self.write(greeting + ', World!') # 以一个字符串作为函数的参数,将其写入到HTTP响应中.
if __name__ == "__main__":
tornado.options.parse_command_line() # 使用options模块来解析命令行输入的命令
app = tornado.web.Application(handlers=[(r"/", IndexHandler)]) # 创建一个Tornado的Application类的实例,handlers应用那个类来响应请求.
http_server = tornado.httpserver.HTTPServer(app) # 以下的代码会被反复使用,一旦Application对象被创建,传递给Tornado的HTTPServer对象
http_server.listen(options.port) # 使用在命令行指定的端口进行监听,通过options对象取出
tornado.ioloop.IOLoop.instance().start() # 在程序准备好接受HTTP请求后,创建一个Tornado的LOLoop实例.
python hello.py --port=8000
然后就能访问8000
端口了
参数handlers
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
这个handlers
参数很重要,类型是元组组成的 列表 ,其中元组第一个元素是 用于匹配的正则表达式 ,第二个元素是 RequestHanlder 类。
(r’/'被看作'^/$'
)当珍珠表达式包含一个捕获分组(被括号括起来),匹配的内容将作为相应HTTP
请求的参数传到RequestHandler
对象中。
字符串服务
使用post请求和传递参数方法
import textwrap
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8000, type=int)
class ReverseHandler(tornado.web.RequestHandler): # 做字符串反转形式
def get(self, input): # input匹配正则表达式第一个括号里的字符串,如果还有一些列额外的括号,则依次传递
self.write(input[::-1])
class WrapHandler(tornado.web.RequestHandler):
def post(self): # 接受post请求
text = self.get_argument('text') # 从post请求提取text文本
width = self.get_argument('width', 40) # 没有宽度默认为40
self.write(textwrap.fill(text, int(width))) # Python内建的textwrap
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[
(r"/reverse/(\w+)", ReverseHandler), # 将匹配的表达式,作为参数传递给RequestHandler类
(r"/wrap", WrapHandler)
]
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
- 从传入的
HTTP
请求获得信息(get_argument和出入到get和post的参数) - HTTP相应(使用self.write()方法)
HTTP状态码
使用RequestHandler
类的set_status()
方法显式地设置HTTP
状态码,在某些情况下会自动设置HTTP
状态码。
404Not Found
HTTP请求的路径无法匹配任何RequestHandler
类对应的模式。
400Bad Request
调用了没有默认值的get_argument
函数,并且没有发现给定名称的参数。
405Method Not Allowed
传入的请求使用了RequestHandler
没有定义的HTTP
方法
Internal Server Error
程序遇到任何不能让其退出的错误时,或代码没有捕捉异常也会导致。
代替默认的响应错误,重写write_error
方法。
class IndexHandler(tornado.web.RequestHandler):
def get(self):
greeting = self.get_argument('greeting', 'Hello')
self.write(greeting + ', friendly user!')
def write_error(self, status_code, **kwargs):
self.write("Gosh darnit, user! You caused a %d error." % status_code)