Web.py 之 Processor

Web.py 之 Processor

  • Processor

    • web.py 的processor 分为两种,api中有相关的convenient loadhookunloadhook 对应了处理http响应以前和以后web

    • codeapi

      loadhook(h)session

      def loadhook(h):
        """
        Converts a load hook into an application processor.
      
            >>> app = auto_application()
            >>> def f(): "something done before handling request"
            ...
            >>> app.add_processor(loadhook(f))
        """
        def processor(handler):
            h()
            return handler()
      
        return processor

      unloadhook(h)app

      def unloadhook(h):
            """
            Converts an unload hook into an application processor.
      
                >>> app = auto_application()
                >>> def f(): "something done after handling request"
                ...
                >>> app.add_processor(unloadhook(f))    
            """
            def processor(handler):
                try:
                    result = handler()
                    is_generator = result and hasattr(result, 'next')
                except:
                    # run the hook even when handler raises some exception
                    h()
                    raise
      
                if is_generator:
                    return wrap(result)
                else:
                    h()
                    return result
      
            def wrap(result):
                def next():
                    try:
                        return result.next()
                    except:
                        # call the hook at the and of iterator
                        h()
                        raise
      
                result = iter(result)
                while True:
                    yield next()
      
            return processor
    • 相对loadhook,unloadhook要复杂一点,主要是体如今返回值是可迭代对象的时候。wrap函数主要是处理了迭代协议next。当迭代结束调用h进行处理。须要特别注意的是h在返回值是iter对象时的处理。wrap的做用只是在迭代结束以后给h调用的机会,而没有将iter对象迭代完成。由于这是考虑到大文件的处理函数

    • 使用起来也很简单设计

      app = auto_application()
        def hook_load(): "something done before handling request"
        def hook_unload(): "something done after handling request"
        app.add_processor(web.loadhook(hook_load)) 
        app.add_processor(web.unloadhook(hook_unload))
    • 实际的例子code

      web.py的官方文档中对sub-application不能使用主应用中的session的解决方案对象

      def session_hook():
            web.ctx.session = session

      这样就能够在sub-application里面经过web.ctx.session调用到主应用的session了。事件

    • 也能够仿照上面的代码本身写一些处理,来处理http响应事件,好比文档

      def words_hook(words):
      
        	def delegate(handler):
        		return words + ':' + handler()
        	return delegate
    • 上面的处理看似合理,其实和设计初衷不符,本意的loadhook和unloadhook除了简化processor函数的操做,还进一步指明了processor的用法,不会对handler的返回值作任何改动。由于根据hook_unload的实现,当返回iter对象的时候,处理会变的复杂,iter对象完成的每每是大文件操做。具体的应用能够具体分析,最后的分析只是针对通常状况。

相关文章
相关标签/搜索