zoukankan      html  css  js  c++  java
  • python---tornado钩子预留解析

    在tornado.web.RequestHandler类中的初始构造方法中:

    class RequestHandler(object):
        """Base class for HTTP request handlers.
    
        Subclasses must define at least one of the methods defined in the
        "Entry points" section below.
        """
        SUPPORTED_METHODS = ("GET", "HEAD", "POST", "DELETE", "PATCH", "PUT",
                             "OPTIONS")
    
        _template_loaders = {}  # type: typing.Dict[str, template.BaseLoader]
        _template_loader_lock = threading.Lock()
        _remove_control_chars_regex = re.compile(r"[x00-x08x0e-x1f]")
    
        def __init__(self, application, request, **kwargs):
            super(RequestHandler, self).__init__()
    
            self.application = application
            self.request = request
            self._headers_written = False
            self._finished = False
            self._auto_finish = True
            self._transforms = None  # will be set in _execute
            self._prepared_future = None
            self._headers = None  # type: httputil.HTTPHeaders
            self.path_args = None
            self.path_kwargs = None
            self.ui = ObjectDict((n, self._ui_method(m)) for n, m in
                                 application.ui_methods.items())
            # UIModules are available as both `modules` and `_tt_modules` in the
            # template namespace.  Historically only `modules` was available
            # but could be clobbered by user additions to the namespace.
            # The template {% module %} directive looks in `_tt_modules` to avoid
            # possible conflicts.
            self.ui["_tt_modules"] = _UIModuleNamespace(self,
                                                        application.ui_modules)
            self.ui["modules"] = self.ui["_tt_modules"]
            self.clear()
            self.request.connection.set_close_callback(self.on_connection_close)
            self.initialize(**kwargs)
    View Code

    尾部自动调用tornado为用户预留的initialize方法(未实现,是由用户调用来实现)

        def initialize(self):
            """Hook for subclass initialization. Called for each request.
    
            A dictionary passed as the third argument of a url spec will be
            supplied as keyword arguments to initialize().
    
            Example::
    
                class ProfileHandler(RequestHandler):
                    def initialize(self, database):
                        self.database = database
    
                    def get(self, username):
                        ...
    
                app = Application([
                    (r'/user/(.*)', ProfileHandler, dict(database=database)),
                    ])
            """
            pass
    View Code

    所以对于之前的session类的使用上可以用到钩子,就像php中的公共控制类中构造方法中调用某些函数,会在每个控制器执行时去执行这些函数,减少在代码中的复用。

    前面session类的改进

    class BaseRequestHandler(tornado.web.RequestHandler):
        #tornado预留钩子函数
        def initialize(self):
            self.session=Session(self)
    
    
    class IndexHandler(BaseRequestHandler):
        def get(self):
            if self.get_argument('u',None) in ['asd','zxc']:
                #在这里有个bug,当程序两次设置值时,逻辑相同,但是由于只发送了一次请求,获取了第一次的py_session
                #在相同逻辑代码处理下random_str=self.handler.get_cookie('py_session')
                #每次都是不正确的,都需要重新创建一个标识符
                #但是后面的刷新过程中由于修改了客户区的py_session,所以可以正常进行操作,但是第一次产生的py_session的依旧存在服务端
                self.session.set_value('is_login',True)
                self.session.set_value('name',self.get_argument('u'))
                #self.get_secure_cookie()
                #The decoded cookie value is returned as a byte string (unlike
                #`get_cookie`).
            else:
                self.write("请登录")
  • 相关阅读:
    hdu 1164 Eddy's research I
    hdu 3794 Magic Coupon
    hdu 1460 完数
    hdu 1201 18岁生日
    求一组整数中所有素数之和
    备忘录
    c判断括弧是否匹配
    N!大整数阶乘问题
    计算一个人从出生到现在活了多少天
    java web.xml配置详解(转)
  • 原文地址:https://www.cnblogs.com/ssyfj/p/8529267.html
Copyright © 2011-2022 走看看