Archive for tornado

昨天下午写了一个postgresql访问接口库psycopg2的异步封装,这个库是支持异步请求postgresql的,所以只是简单的封装了一下。简介了torndb和一个网上写好的异步库momoko,又找到一个网上分享的ppt。写的时候直接用gen.coroutine装饰接口函数,这样我再models里写的时候直接yield query()就行了。 写完对tornado异步封装的代码也看了一些,有了一些理解,不过没有循序看。之前看到时候感觉太乱实在不想从新看了。先记录一下,可能很多错误。 future是保存的异步的结果,这个类是在concurrent.py文件里。 result()方法是返回结果,通过done()方法判断执行结束,就可以用result方法获得结果。 set_result()是设置结果,像gen.Task()就是调用一个带有callback参数的异步方法,返回future,变成为一个可以使用yield协程 的函数,对他就是个函数。2333 这个函数里边就使用了set_result()方法,Task这个函数其实不复杂写了那么多的目的就是把Task装饰的那个

Continue

前边ioloop看完了,application以前也看过一点,现在看看application和IOLoop是怎么结合起来的。 Application里的listen(port),实例化一个HTTPServer(),然后listen port address。 HTTPServer()继承自TCPServer, httputil.HTTPServerConnectionDelegate。HTTPServer参数传入application实例,还有一些参数。app保存在属性request_callback中,调用TCPServer的初始化方法,ioloop默认为None。然后都是参数的 保存。 listen方法是TCPServer里的,第一个方法返回socket,后调用add_sockets。self.ioploop为None,调用类静态方法IOLoop.current(),实例化IOLoop。然后将所有socket保存到_sockets中,调用在netutil.py里的add_accept_handler。 add_accept_handler第二个参数是一个函数,_

Continue

tornado.ioloop.IOLoop.instance().start() ioloop继承自Configurable。 configurable_base返回IOLoop,然后调用configured_class,然后再看IOLoop的configurable_default。这里面根据不同系统选择了不同的IOLoop类实现返回。下一步是initialize初始化了。 看一下epoll吧。 先找了一下IOLoop的start(),意料之中。因为configurable_default返回的类实现都是别的类,要看具体别的类中的定义了。 epoll.py里的EPollIOLoop只定义了initialize,EPollIOLoop继承自PollIOLoop,在ioloop.py文件里。 PollIOLoop继承自IOLoop,现在还不知道为什么这么继承,先往下看。super,IOLoop里边是空的。下边用到initialize第二个参数是impl。在PollIOLoop里是select.epoll()。还要去看看platform/select.py,额 我去还是

Continue

想看一下IOLoop类的实现,发现继承自Configurable。就先看一下这个类。 Configurable类在util.py这个文件里。Configurable类的子类有AsyncHTTPClient,Resolver,IOLoop。 看__new__构造方法,configurable_base返回一个子类的实现,如果返回类本身。类的实现需要调用configured_class,主要初始化了__impl_class在configurable_default里。然后通过子类中configurable_default的定义选择不同的__impl_class(类实现)返回。initialize初始化类。 然后没了 ,没想到这么短。等后边看看IOLoop。

Continue

tornado里面有关几个cookie的处理,在web.py文件里。 <tt>get_cookie,<tt>set_cookie普通的设置cookie,<tt>clear_cookie,<tt>clear_all_cookies是删除cookie。</tt></tt></tt></tt> 还有两个是<tt>get_secure_cookie,<tt>set_secure_cookie,这两个的功能是能够防止用户的cookie被伪造。</tt></tt> <tt><tt>先看看函数处理方法。</tt></tt> 看<tt>set_secure_cookie,里边与set_cookie的区别就是value经过</tt>create_signed_value的处理。 create_signed_value,得到当前时间,将要存的value base64编码,通过_cookie_signature将 加上name,这三个值加密生成签名。然后将签名,value的base64编码,时间戳用|连接,作为cookie的值。 _cookie_signature,就是根

Continue

还是从helloworld里,application = tornado.web.Application([(r"/", MainHandler),]),然后看类Application。 <em>参数</em> transforms用于头信息的定义,列表存储处理类名。ChunkedTransferEncoding,GZipContentEncoding继承自OutputTransform,可以实例化类的时候传入参数transforms,想gzip的启用可以使用setting,例如:settings = {'gzip': True}传入settings参数。 handlers列表,元素为(regexp, request_class)元祖。 settings,还可以设置static_path来标明静态文件访问路径,static_url_prefix标明访问前缀,没有默认设置"/static/"。给添加静态文件访问路由。最后合并参数中 的handlers。这里有一个StaticFileHandler类,等会儿看。 再往下是否载入自动更新模块,通过settings中d

Continue

下载了tornado 0.1的代码进行学习,之所以选择tornado,是看网上对非阻塞模式评价很高,他也不仅仅是web框架,而且相对django来说代码少多了(django的代码也有看)。选择0.1的原因还是代码相对简单,差别也不大。 查看demos里的helloworld,代码如下: <pre lang="python">import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web import logging from tornado.options import define, options define("port", default=8888, help="run on the given port", type=int) class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")

Continue