Tornador之初识(一)

时间:2023-03-09 06:08:47
Tornador之初识(一)

一、最简单的web服务器

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',))
  sock.listen()   while True:
    connection, address = sock.accept()
    handle_request(connection)
    connection.close() if __name__ == '__main__':
  main()

二、B-S模式浅析:

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

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

  3、建立链接后,web应用根据请求的不同,给用户返回相应的数据。

  4、断开socket连接。(之所以说http是短链接,其实就是因为每次请求完成后,服务器就会断开socket链接)

三、Tornador的hello world案例


import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
"""
处理"/"的视图类
"""
def get(self):
"""
get方法的处理
:return:
"""
self.write("Hello, world") # write方法会直接写到socket中 if __name__ == "__main__":
# tornado的视图分发
application = tornado.web.Application([
(r"/", MainHandler),
])
# 后台socket会监听8888端口
application.listen(8888)
# 后台的ioloop会不断循环
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并监听端口
  • class MainHandler(tornado.web.RequestHandler):
    """
    处理"/"的视图类
    """
    def get(self):
    """
    get方法的处理
    :return:
    """
    self.write("Hello, world") # write方法会直接写到socket中
     application = tornado.web.Application([
    (r"/", MainHandler),
    ])
    # 后台socket会监听8888端口
    application.listen(8888)
  • 处理请求阶段,即:当有客户端连接时,接受请求,并根据请求的不同做出相应的相应
 # 后台的ioloop会不断循环
tornado.ioloop.IOLoop.instance().start()