• Tornado


        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

    Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
    得利于其非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。

    1、源码阅读可以从低版本开始,简单,功能基本一样

    2、下载安装

    下载地址:http://www.tornadoweb.org.cn/

    安装:解压后-->cd到文件目录-->python2 setup.py build --> python2 setup.py install

    #python2.7中不识别中文,开头记得加上
    -*- coding:utf-8 -*-

    3、简单的实例(Python3)

    • test.py
    import tornado.ioloop
    import tornado.web
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            #相当于HTTPresponse
            self.write("Hello, world")
    
    class LoginHandler(tornado.web.RequestHandler):
        def get(self):
            self.render('login.html')
    
        def post(self,*args,**kwargs):
            v = self.get_argument('username')
            print(v)
            #跳转页面
            self.redirect('/login.html')
    
    settings = {
        'template_path':'templates',#HTML路径
        'static_path':'statics',   #static路径
        # 'static_url_prefix':"/aaa/",  #设置页面上调用时的前缀
    }
    
    #application对象中封装了:路由信息,配置信息
    application = tornado.web.Application([
        (r"/index.html", MainHandler),
        (r"/login.html", LoginHandler),
    ],**settings)
    
    if __name__ == "__main__":
        #创建socket对象
        #创建监听列表,r,w,e = select.select([socket,])
        application.listen(8888)
        #启动
        tornado.ioloop.IOLoop.instance().start()
    • login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <form action="/login.html" method="post">
            <input type="text" name="username" placeholder="用户名"/>
            <input type="submit" value="提交"/>
        </form>
        <!--这里的/static/只是静态文件路径的默认前缀,可以修改的-->
        <img src="/static/1.jpg"/>
    </body>
    </html>

    二、源码阅读

    1、从运行程序开始,即启动服务端

    • - 加载路由关系

    • - 加载配置文件

    • - 启动socket

    2、用户开始访问

    • - 匹配路由

    • - 匹配成功后,执行指定类的方法

    3、经典的hello world 案例:

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

    简而言之:

    1、在启动程序阶段,第一步,获取配置文件然后生成url映射(即:一个url对应一个XXRequestHandler,从而让XXRequestHandler来处理指定url发送的请求);第二步,创建服务器socket对象并添加到epoll中;第三步,创建无限循环去监听epoll。

    2、在接收并处理请求阶段,第一步,接收客户端socket发送的请求(socket.accept);第二步,从请求中获取请求头信息,再然后根据请求头中的请求url去匹配某个XXRequestHandler;第三步,匹配成功的XXRequestHandler处理请求;第四步,将处理后的请求发送给客户端;第五步,关闭客户端socket。

     三、路由系统

    路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类。

    Tornado中原生支持二级域名的路由,如:

    四、模板引擎

     Tornao中的模板语言和django中类似,模板引擎将模板文件载入内存,然后将数据嵌入其中,最终获取到一个完整的字符串,再将字符串返回给请求者。

    Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的 例如 {% if len(items) > 2 %}。表达语句是使用 {{ 和 }} 包起来的,例如 {{ items[0] }}

    控制语句和对应的 Python 语句的格式基本完全相同。我们支持 ifforwhile 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。还通过 extends 和 block 语句实现了模板继承。这些在 template 模块 的代码文档中有着详细的描述。

    注:在使用模板前需要在setting中设置模板路径:"template_path" : "tpl"

    在模板中默认提供了一些函数、字段、类以供模板使用:
    
    escape: tornado.escape.xhtml_escape 的別名
    xhtml_escape: tornado.escape.xhtml_escape 的別名
    url_escape: tornado.escape.url_escape 的別名
    json_encode: tornado.escape.json_encode 的別名
    squeeze: tornado.escape.squeeze 的別名
    linkify: tornado.escape.linkify 的別名
    datetime: Python 的 datetime 模组
    handler: 当前的 RequestHandler 对象
    request: handler.request 的別名
    current_user: handler.current_user 的別名
    locale: handler.locale 的別名
    _: handler.locale.translate 的別名
    static_url: for handler.static_url 的別名
    xsrf_form_html: handler.xsrf_form_html 的別名
    

     a. 定义

    五、静态文件

    对于静态文件,可以配置静态文件的目录和前段使用时的前缀,并且Tornaodo还支持静态文件缓存。

    import tornado.ioloop
    import tornado.web
     
     
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            self.render('home/index.html')
     
    settings = {
        'template_path': 'template',
        'static_path': 'static',
        'static_url_prefix': '/static/',
    }
     
    application = tornado.web.Application([
        (r"/index", MainHandler),
    ], **settings)
     
     
    if __name__ == "__main__":
        application.listen(80)
        tornado.ioloop.IOLoop.instance().start()
    app.py
    • index.html
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <link href="{{static_url("commons.css")}}" rel="stylesheet" />
    </head>
    <body>
        <h1>hello</h1>
    </body>
    </html>
  • 相关阅读:
    Dev:LookUpEdit的用法
    Excel:写入Excel单纯写入
    浅拷贝与深拷贝
    自行车的种类
    简单的话
    Excel:导入导出原文02
    VS2010中出现无法嵌入互操作类型
    U盘有时候不显示(win7 64位)
    Knockout学习之Single Page Application
    CSS点滴整理
  • 原文地址:https://www.cnblogs.com/charliedaifu/p/10229557.html
Copyright © 2020-2023  润新知