zoukankan      html  css  js  c++  java
  • global,tornado的write_error,tornado的中间件的写法

    1.global关键字:Python中定义函数时,若想在函数内部对函数外的变量进行操作,就需要在函数内部声明其为global

    2.python中引用变量,全局变量是可以引用的,但是修改时必须加global关键字

    3.tornado中间件

    实现在线人数统计
    和登陆验证功能

    from tornado.ioloop import IOLoop
    from tornado.web import RequestHandler, Application
    
    
    class MiddleWare(object):
        def process_request(self, handler):
            pass
    
        def process_response(self, handler):
            pass
    
    
    class CheckLogin(MiddleWare):
        def is_login(self, handler):
            pwd = handler.get_argument("pwd", "")
            if not pwd:
                raise Exception("login required")
            # else:
            #     # 判断用户名密码
            #     return
    
        def process_request(self, handler):
            self.is_login(handler)
    
    
    session_counter = 0
    
    
    class Counter(MiddleWare):
        def process_request(self, handler):
            global session_counter
            session_counter = session_counter + 1
    
    
    class MiddleHandler(RequestHandler):
    
        def initialize(self, middleware):
            self.middleware = middleware
    
        def prepare(self):
            # print(self)
            # self 是Echohandler的类的实例化对象
            for middleware in self.middleware:
                middleware.process_request(self)
    
        def finish(self, chunk=None):
            super(MiddleHandler, self).finish(chunk)
    
        def write_error(self, status_code, **kwargs):
            # print(kwargs)#{'exc_info': (<class 'Exception'>, Exception('login required',), <traceback object at 0x0000020307E9CC08>)}
            exc_cls, exc_instance, trace = kwargs.get("exc_info")
            if status_code != 200:
                self.set_status(status_code)
                self.write({"msg": str(exc_instance)})
    
    
    class EchoHandler(MiddleHandler):
        def get(self):
            message = self.get_argument("msg", "world")
    
            self.write("hello, %s, current online: %d" % (message, session_counter))
    
    
    def get_middleware():
        return (CheckLogin(), Counter())
    
    
    import tornado.ioloop
    
    if __name__ == '__main__':
        middleware_list = get_middleware()
        print(middleware_list)
        app = Application([(r"/echo", EchoHandler, dict(middleware=middleware_list))])
        app.listen(8888)
        tornado.ioloop.IOLoop.current().start()
  • 相关阅读:
    剑指offer 18. 二叉树的镜像
    用texarea存储数据,查询数据库后原样显示在jsp中,包括空格和回车换行
    MySQL中MyISAM与InnoDB区别及选择
    聚簇索引和非聚簇索引
    SQL注入攻击
    剑指offer 36. 两个链表的第一个公共结点
    剑指offer 56.删除有序链表中的重复结点
    jdk1.8的HashMap和ConcurrentHashMap
    java8的ConcurrentHashMap为何放弃分段锁,为什么要使用CAS+Synchronized取代Segment+ReentrantLock
    如何彻底卸载Jenkins(Windows版本)
  • 原文地址:https://www.cnblogs.com/liuer-mihou/p/11484742.html
Copyright © 2011-2022 走看看