Tornado源码探寻(开篇)

1、先从一个简单的socket提及

 

运行脚本并在浏览器上访问http://127.0.0.1:8080python

#!/usr/bin/env python
#coding:utf-8
 
import socket
 
def handle_request(client):
    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK\r\n\r\n")
    client.send("Hello, Seven")
 
def main():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost',8080))
    sock.listen(5)
 
    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()
 
if __name__ == '__main__':
    main()

上述分析:web

  一、浏览器其实就是一个socket客户端,而web应用其实就是一个socket服务端,而且web应用在服务器上一直在监听某个端口。正则表达式

  二、当浏览器请求某个web应用时,须要指定服务器的IP(DNS解析)和端口创建一个socket链接。浏览器

  三、创建连接后,web应用根据请求的不一样,给用户返回相应的数据。服务器

  四、断开socket链接。(之因此说http是短连接,其实就是由于每次请求完成后,服务器就会断开socket连接)app

对于Web框架来讲,通常分为两类,其中一类则是包含上述 4部分 内容的框架,另一类就是只包含 第3部分 功能的框架。tornado就是一中属于前者的框架。框架

Tornado 是一个基于 Python 开发的web框架,较其余 Web 框架的区别是:采用了非阻塞的方式和对epoll的应用。这意味着对于实时 Web 服务来讲,Tornado 是一个理想的 Web 框架。socket

 

2、初识Tornado

在使用tornado以前须要安装,对于如何安装这里不作太多赘述,详见官网函数

经典的hello world 案例:tornado

import tornado.ioloop
import tornado.web
 
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")
 
application = tornado.web.Application([
    (r"/index", MainHandler),
])
 
if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

运行该脚本,依次执行:

  • 建立一个Application对象,并把一个正则表达式'/'和类名MainHandler传入构造函数:tornado.web.Application(...)  
  • 执行Application对象的listen(...)方法,即:application.listen(8888)
  • 执行IOLoop类的类的 start() 方法,即:tornado.ioloop.IOLoop.instance().start()

整个过程其实就是在建立一个socket服务端并监听8888端口,当请求到来时,根据请求中的url和请求方式(post、get或put等)来指定相应的类中的方法来处理本次请求,在上述demo中的url只为http://127.0.0.1:8888/index的请求指定了处理类MainHandler。因此,在浏览器上访问:http://127.0.0.1:8888/index,则服务器给浏览器就会返回 Hello,world ,不然返回 404: Not Found(tornado内部定义的值), 即完成一次http请求和响应。

由上述分析,咱们将整个Web框架分为两大部分:

  • 待请求阶段,即:建立服务端socket并监听端口
  • 处理请求阶段,即:当有客户端链接时,接受请求,并根据请求的不一样作出相应的相应

 

未完待续……………………

相关文章
相关标签/搜索