Tornado

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)
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值