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

    本系列博文计划:

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

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

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

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

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

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

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

  • 相关阅读:
    Day 20 初识面向对象
    Day 16 常用模块
    Day 15 正则表达式 re模块
    D14 模块 导入模块 开发目录规范
    Day 13 迭代器,生成器,内置函数
    Day 12 递归,二分算法,推导式,匿名函数
    Day 11 闭包函数.装饰器
    D10 函数(二) 嵌套,命名空间作用域
    D09 函数(一) 返回值,参数
    Day 07 Day08 字符编码与文件处理
  • 原文地址:https://www.cnblogs.com/maozhr/p/5840663.html
Copyright © 2011-2022 走看看