参考书籍《Introduction to Tornado》
1.1 Tornado是什么?
Tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够 强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。此外,它还拥有处理安全性、用户验证、社交网络以及与外部服务(如数据库和网站API) 进行异步交互的工具。
1.2 Hello Tornado
下面是一个全功能的Tornado应用的基础示例:
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
在程序的最顶部,我们需要导入一些Tornado模块,Tornado还包含一些其他模块,但是在这个例子中,我们最起码需要包含着四个模块。
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
这是一个有用的模块(tornado.options)来从命令行中读取设置。我们在这里使用这个模块指定我们的应用监听HTTP请求的端口。
如果一个与define语句中同名的的设置在命令行中被给出,那么他将成为全局options的一个属性。如果程序使用了--help
,程序会打印出你在define函数中help指定的参数文本。如果没有指定值,可以用default=所指定的值来代替。type对参数类型进行检验,这里为int
,当参数类型不合适是会抛出一个异常。
class IndexHandler(tornado.web.RequestHandler):
def get(self):
greeting = self.get_argument('greeting', 'Hello')
self.write(greeting + ', friendly user!')
这个例子中只定义了一个GET
方法,在以后的实际应用中我们可以用到GET POST
等其他的HTTP方法。
这里的get_argument
是RequestHandler
的内建方法,从一个查询字符串中获取greeting
的值。Tornado将使用get_argument
的第二个参数值作为默认值。
这里的write
方法也是RequestHandler
种的一个有用的方法,它将字符串形式的参数写入HTTP响应中。在这里是将greeting
参数提供的值写入greeting
中,并写到响应中。
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
Demo:
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
greeting = self.get_argument('greeting', 'Hello')
self.write(greeting + ', friendly user!')
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
到这里 这个简单的例子便可以实现了。
可以在命令行中实现,也可以在IDE中实现(个人使用的是Pycharm)
接下来是一个稍微复杂一点的例子,对字符串进行操作的例子:
import textwrap
import tornado.httpserver
import tornado.ioloop import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class ReverseHandler(tornado.web.RequestHandler):
def get(self, input):
self.write(input[::-1])
class WrapHandler(tornado.web.RequestHandler):
def post(self):
text = self.get_argument('text')
width = self.get_argument('width', 40)
self.write(textwrap.fill(text, int(width)))
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[
(r"/reverse/(\w+)", ReverseHandler),
(r"/wrap", WrapHandler)
]
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
这里的GET
请求会返回URL路径中指定的字符串的反转格式。如/reverse/tornado
返回odanrot。
而POST
请求将从text格式中取得指定的文本。
这里需要正则表达式相关的知识,到了后面的学习中,必要时再去深入学习。
到目前我们使用了POST
GET
,Tornado还支持任何合法的HTTP请求。
HTTP状态码
404 Not Found #路径无法匹配时返回404
400 Bad Request #调用一个么有默认值的get_argument函数,并且没有找到给定名称的参数,返回400
405 Method Not Allowed #传入的请求使用了没有定义过的HTTP方法,返回405
500 Internal Server Error #当遇到任何不能让其退出的错误,也会返回500
PS:
看完第一章有一个基本的了解,但是关于web方面的知识还是比较少,譬如http方面。需要同时看《TCP/IP》
而且第一次写这种笔记的话,有些赘述,但是好在可以让自己更好的了解,有一个整理和总结对于学习而言亦有帮助。共勉