Tornado学习笔记(1)

364 查看

参考书籍《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_argumentRequestHandler的内建方法,从一个查询字符串中获取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》
而且第一次写这种笔记的话,有些赘述,但是好在可以让自己更好的了解,有一个整理和总结对于学习而言亦有帮助。共勉