# tornado初识

来源:互联网 发布:防蓝光近视眼镜 知乎 编辑:程序博客网 时间:2024/06/15 23:20

tornado初识

例1

helloworld示例

import tornado.web# tornado.options来从命令行中读取设置from tornado.options import define, optionsdefine("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')  # 获取url参数greeting的值        self.write(greeting + ', friendly user!')if __name__ == "__main__":    """    可以直接运行该脚本,也可以通过命令行方式运行,    python hello_world.py --port=8888    """    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()

剖析

  • tornado.options:从命令行中读取设置,如果一个与define语句中同名的设置在命令行中被给出,那么它将成为全局options的一个属性。如果用户运行程序时使用了–help选项,程序将打印出所有你定义的选项以及你在define函数的help参数中指定的文本。如果用户没有为这个选项指定值,则使用default的值进行代替。Tornado使用type参数进行基本的参数类型验证,当不合适的类型被给出时抛出一个异常
  • tornado.options.parse_command_line() 来解析命令行
  • app = tornado.web.Application(handlers=[(r”/”, IndexHandler)]),告诉Tornado应该用哪个类来响应请求

例2

import textwrapimport tornado.webfrom tornado.options import define, optionsdefine("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', 10)        self.write(textwrap.fill(text, int(width)))  # textwrap.fillif __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()
  • textwrap.fill: 将一行比较长的字符串切割成多行字符串、换行符分割

异常处理及状态码

  • 例3:write_error异常处理
import tornado.webfrom tornado.options import define, optionsdefine("port", default=8001, 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!')    def write_error(self, status_code, **kwargs):        self.write("Gosh darnit, user! You caused a %d error." % status_code)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()
  • 测试: curl -d foo=bar http://localhost:8000/
Gosh darnit, user! You caused a 405 error.
  • 400 Bad Request: 调用了一个没有默认值的get_argument函数,并且没有发现给定名称的参数,Tornado将自动返回一个400
  • 405 Method Not Allowed: 传入的请求使用了RequestHandler中没有定义的HTTP方法
原创粉丝点击