zoukankan      html  css  js  c++  java
  • day23-Tornado

    一,安装方法:

    # pip3 install tornado
      

    二,基本使用:
        1、路由系统
            a、原生支持restful
            b、二级域名
                application.add_handlers("cmdb.oldboy.com",[
                    (r"/main", CmdbHandler),
                ])
            c、动态
                    

    # Author:Alex Li
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # pip3 install tornado
    import tornado.ioloop
    import tornado.web
    import hashlib
    import time
    def md5(arg):
        m = hashlib.md5()
        m.update(bytes(arg,encoding='utf-8'))
        return m.hexdigest()
    
    app_id_list = [
        '1suidfmsdfoj',
        '1su5451254212'
    ]
    visited_api = [
        "http://www.oldboy.com:8888/api?app_id=8e69354826691f0ea816d7108be7c122|1477194640.0149357"
    ]
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            app_id = self.get_argument('app_id',None)
            md, current_time = app_id.split('|')
            server_current_time = time.time()
            client_current_time = float(current_time)
            if client_current_time< server_current_time-10:
                self.write('')
                return
            # 10s以内发送的数据
            # 正常用户发送请求: 11:10:10
            # 服务器请求: 11:10:12
            if app_id in visited_api:
                self.write('')
                return
    
            # current_time客户端的当前时间
            # 服务器的当前事件
    
    
            # 将黑客随便写的url过滤
            flag = False
            for key in app_id_list:
                new_str = "%s|%s" %(key, current_time)
                server_md = md5(new_str)
                if md == server_md:
                    # redis,10s之后就小时
                    visited_api.append(app_id)
                    flag = True
                    break
            if flag:
                self.write('ok')
            else:
                self.write('')
    
    application = tornado.web.Application([
        (r"/api", MainHandler),
    ])
    
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    api


        2、模版引擎
            - 功能更接近python
            - 母板
            - uimethods
            - uimodules
        

    # Author:Alex Li
    from tornado.web import UIModule
    # from tornado import escape
    
    class custom(UIModule):
    
        def javascript_files(self):
            return ['http://assdfasdfasdf.js','http://11111.js',]
    
        def embedded_javascript(self):
            return "function f1(){alert(123);}"
    
        def css_files(self):
            pass
    
        def embedded_css(self):
            pass
    
        def render(self, *args, **kwargs):
            return "<h1>CCCC</h1>"
    母版


        3、cookie
            请求cookie和响应cookie
            明文,加密
            set_cookie(k,'alex')
            
            set_cookie(k,'alex')
            # 加密:
                1、当前时间戳
                2、内容
                3、md5
                # 服务器:key
                
                
                # 字符串拼接
                        new_str = 1477191363.8245482|key ====》base64加密
                # 新字符串md5
                        md5(new_str)
                        
                # md5(new_str)|alex|1477191363.8245482
                
                
                
                
                md5(1477191363.8245482)
                
                # asdfasdfasdfasdfasdfasdf|alex
                
                # asdfasd234234234asdfasdf|alex

    代码:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # pip3 install tornado
    import tornado.ioloop
    import tornado.web
    
    class MainHandler(tornado.web.RequestHandler):
        def get(self):
            # self.write("Hello, world")
            # 头、内容、cookie
            # self.get_argument()
            # self.set_cookie()
            # self.get_cookie()
            #
            # self.set_secure_cookie()
            # self.get_secure_cookie()
            # 获取所有的请求头
            # self._headers
            self.set_header('k','v')
            self.render('main.html', li=[11,22,33,44])
    
    class CmdbHandler(tornado.web.RequestHandler):
        def get(self):
            self.write("cmdb")
    
    import xo
    import ox
    settings = {
        'template_path': 'views',
        'ui_methods':xo,
        'ui_modules':ox,
    }
    
    application = tornado.web.Application([
        (r"/main", MainHandler),
    ],**settings)
    application.add_handlers("cmdb.oldboy.com",[
        (r"/main", CmdbHandler),
    ])
    if __name__ == "__main__":
        application.listen(8888)
        tornado.ioloop.IOLoop.instance().start()
    app


        4、请求头,相应头
        
        ...
        
        5、自定义Session:
            a.
                
                def index(request):
                    request.session['k'] = 123
                    request.seeeion['k']
                    del request.session['k']
                    
            
                class Foo:
                
                    def __getitem__(key):
                        return 123
                        
                    def __setitem__(key,value):
                        pass
                        
                    def __delitem__(key):
                        pass

                obj = Foo()
                ret = obj['xxx']
                
                obj['xxxx'] = 123
                
                del obj['xxxx']
            
            b. tornado的扩展点
                class BaseHandler(tornado.web.RequestHandler):

                    def initialize(self):
                        self.sss = {'k': 123}

                class MainHandler(BaseHandler):

                    def get(self):
                        
                        print(self.sss)
                        self.write('ok')
                        
            c. Session原理
            
     

    # Author:Alex Li
    
    import hashlib
    import time
    from Session import conf
    
    class SessionHandler:
        def initialize(self):
            self.session_obj = SessionFacotory.get_session_obj(self)
    
    
    class SessionFacotory:
        @staticmethod
        def get_session_obj(handler):
            if conf.session_type == 'redis':
                return RedisSession(handler)
            elif conf.session_type == 'memcache':
                return RedisSession(handler)
            else:
                return MemorySession(handler)
    
    
    def md5():
        m = hashlib.md5()
        m.update(bytes(str(time.time()),encoding='utf-8'))
        return m.hexdigest()
    
    class MemorySession:
        container = {
    
        }
        # self.r_str当前用户的随机字符串
        def __init__(self,handler):
    
            random_str = handler.get_cookie('___session_id___')
            if random_str:
                # 客户端有cookie
                # 合法cookie
                if random_str in MemorySession.container:
                    self.r_str = random_str
    
                else:
                    # 非法cookie
                    random_str = md5()
                    MemorySession.container[random_str] = {}
                    self.r_str = random_str
            else:
                # 客户端无cookie,表示是新用户的到来
                random_str = md5()
                MemorySession.container[random_str] = {}
                self.r_str = random_str
    
            handler.set_cookie('___session_id___', random_str, expires=time.time() + 200)
    
        def __setitem__(self, key, value):
            MemorySession.container[self.r_str][key] = value
    
        def __getitem__(self, item):
            return MemorySession.container[self.r_str].get(item,None)
    
        def __delitem__(self, key):
            del MemorySession.container[self.r_str][key]
    
    
    class RedisSession:
        def __init__(self):
            pass
        def __getitem__(self, item):
            pass
    
        def __setitem__(self, key, value):
            pass
    
        def __delitem__(self, key):
            pass
    session

         
        6、自定义form表单验证
            

    # Author:Alex Li
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import tornado.ioloop
    import tornado.web
    import re
    
    class InputText:
        def __str__(self):
            return '<input type="text" />'
    
    class InputPassword:
        def __str__(self):
            return '<input type="password" />'
    
    
    class StringField:
        reg = "^w+$"
        def __init__(self,w=None):
            self.w = w if w else InputText()
    
        def match(self):
            pass
    
    
        def __str__(self):
            return str(self.w)
    
    
    class StringListField:
        reg = "^w+$"
        def __init__(self):
            pass
    
        def match(self):
            pass
    
    class EmailField:
        reg = "^w+$"
        def __init__(self):
            pass
    
    
    class IndexForm:
        def __init__(self):
            self.user = StringField()
            self.pwd = StringField(w=InputPassword())
    
        def is_valid(self,handler):
            flag = True
            for k,v in self.__dict__.items():
                # k="user" v="^w+$"   StringField对象
                # k="pwd" v="^w+$"   EmailField对象
                if type(v) == StringListField:
                    input_value = handler.get_arguments(k)
                else:
                    input_value = handler.get_argument(k)
    
                result = v.match(input_value)
                if not result:
                    flag = False
            return flag
    
    class IndexHandler(tornado.web.RequestHandler):
    
        def get(self, *args, **kwargs):
            form = IndexForm()
            self.render('index.html', form=form)
    
        def post(self, *args, **kwargs):
            form = IndexForm()
            ret = form.is_valid(self)
            print(ret)
    
    settings = {
        'template_path': 'views'
    }
    
    application = tornado.web.Application([
        (r"/index.html", IndexHandler),
    
    ], **settings)
    
    if __name__ == "__main__":
    
        print('http://127.0.0.1:8005')
        application.listen(8005)
        tornado.ioloop.IOLoop.instance().start()
    form
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <form method="post" action="/index.html">
            {% raw form.user %}                                   #生成html非字符串
            {% raw form.pwd %}
            <hr >
            <input type="text" name="user" />
            <input type="text" name="pwd" />
            <input type="submit" value="提交" />
        </form>
    </body>
    </html>
    index


        
        7、异步非阻塞
            装饰器 + Future 从而实现Tornado的异步非阻塞
            
            # Future容器,默认hung住请求,等待用户向future中发送数据
            # hung住: Http未断开;Tornado可以单线程去操作其他请求
            # self.finish()
        
        
            使用:
                1、add_time,设置等待时间
                2、Future,添加回调函数,设置值,不再hung住 *******************
                3、httpclient类库
                

    class AsyncHandler(tornado.web.RequestHandler):
     
        @gen.coroutine
        def get(self):
            future = Future()
            future.add_done_callback(self.doing)
            yield future
            #
            # tornado.ioloop.IOLoop.current().add_future(future,self.doing)
            # yield future
     
        def doing(self,*args, **kwargs):
            self.write('async')
            self.finish()
    异步非阻塞


        
        - 示例聊天室:
            发现聊天室,连接不断开:
            - 轮训  ,setInterval

    # Author:Alex Li
    # Author:Alex Li
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import tornado.ioloop
    import tornado.web
    import time
    import json
    
    
    class IndexHandler(tornado.web.RequestHandler):
    
        def get(self, *args, **kwargs):
            self.render('index.html')
    
    li = [
        {'id':123123, 'content': 'asdfasdfasdf'}
    ]
    class MsgHandler(tornado.web.RequestHandler):
    
        def get(self, *args, **kwargs):
            index = self.get_argument('index')
            index = int(index)
            if index == 0:
                self.write(json.dumps(li))
            else:
                self.write(json.dumps(li[index:]))
    
    settings = {
        'template_path': 'views',
        'static_path': 'static',
    }
    
    application = tornado.web.Application([
        (r"/index.html", IndexHandler),
        (r"/msg.html", MsgHandler),
    
    ], **settings)
    
    if __name__ == "__main__":
    
        print('http://127.0.0.1:8006')
        application.listen(8006)
        tornado.ioloop.IOLoop.instance().start()
    app


            - 长轮训,实例:::::::对异步非阻塞的应用 必须会

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <div id="container">
    
        </div>
    
        <script src="/static/jquery-1.12.4.js"></script>
        <script>
            INDEX = 0;
    
            function get_message(){
                $.ajax({
                    url: '/msg.html',
                    type: 'get',
                    data: {'index': INDEX},
                    dataType: 'json',
                    success: function (arg) {
                        $.each(arg, function(k,v){
                            INDEX +=1;
                            var tag = document.createElement('p');
                            tag.innerHTML = v.content;
                            $('#container').append(tag);
                        });
                        get_message()
                    }
                })
            }
    
            get_message()
        </script>
    </body>
    </html>
    index


            - websocket
        
        8、方案
        
            用户权限管理
            - 普通用户
            - 销售
            - 讲师
        
            ====》 Django

  • 相关阅读:
    获取文件夹下的所有文件名,并修改某些文件名 Alec
    生成XML文件,并保存到本地文件 Alec
    按Enter键起到Tab键的效果 Alec
    网站底部浮动js Alec
    NET Framework4.0注册 Alec
    从FTP上下载文件到本地 Alec
    生成txt日志操作文件 Alec
    不使用第三个变量,实现两个变量值的交换 Alec
    生成指定位数的回文素数 Alec
    单击gridview某一列弹出详细信息 Alec
  • 原文地址:https://www.cnblogs.com/aaron-shen/p/6006590.html
Copyright © 2011-2022 走看看