zoukankan      html  css  js  c++  java
  • 第一篇:白话tornado源码之一个脚本引发的血案

    https://www.cnblogs.com/wupeiqi/p/4375445.html

    本系列博文计划:

      1、剖析基于Python的Web框架Tornado的源码

      2、为Python开发一个完善的MVC框架  

      首先将带着大家一起来剖析基于python编写的Web框架 tornado ,本着易读易懂的目标来写这一系列,寄希让小白也能zeng明白其中的道理,与其说剖析还不如说是白话,因为本系列都会用通俗的语言去描述Web框架中的各个知识点。

    一个脚本引发的一场“血案”.... 

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #!/usr/bin/env python
    #coding:utf-8
     
    import socket
     
    def handle_request(client):
        buf = client.recv(1024)
        client.send("HTTP/1.1 200 OK ")
        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()

    注意:对于上述的demo来说,我们没有对请求做分析,对所有的请求都做了相同的处理。

    上述分析:

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

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

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

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

      对于Web框架来说,一般分为两类,其中一类则是包含上述 4部分 内容的框架,另外一类就是只包含 第3部分 功能的框架。tornado就是一中属于前者的框架。tornado 是一个基于 Python 开发的web框架,较其他 Web 框架的区别是:采用了非阻塞的方式和对epoll的应用。这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。

    初识tornado

      上述用一个简陋的demo展示了Web请求从浏览器到服务器之间的流程,接下来就以上帝视角来对tornado框架做一个全局的介绍。在使用tornado之前需要安装,对于如何安装这里不做太多赘述,详见官网

    经典的hello world 案例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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并监听端口
    • 处理请求阶段,即:当有客户端连接时,接受请求,并根据请求的不同做出相应的相应

    那么在记下来的博文中将按照这两种分类来进行剖析...

  • 相关阅读:
    ASCII&Base64
    CentOS自动同步时间
    Java的HashMap
    Java线程同步操作
    Nginx基本配置与应用
    vc中调用Com组件的方法详解
    VC++ try catch (转)
    oracle中exp,imp的使用详解
    jdbc oracle 连接字符串
    标准的开源实现
  • 原文地址:https://www.cnblogs.com/ZT152156/p/11219987.html
Copyright © 2011-2022 走看看