首页 > 代码库 > Tornador之初始(一)

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,8080))
  sock.listen(
5)

  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并监听端口
  • 处理请求阶段,即:当有客户端连接时,接受请求,并根据请求的不同做出相应的相应

Tornador之初始(一)