Tornado 学习笔记

来源:互联网 发布:环境监测数据空虚作假 编辑:程序博客网 时间:2024/05/18 23:24
 交流QQ群:26651479


一、安装 Tornado
    目前最新版本的下载: http://github.com/downloads/facebook/tornado/tornado-1.2.1.tar.gz

    解压之后,进入解压的目录,执行:
        python setup.py build
        python setup.py install

    如果开发环境是py2.6+,也可以简单的把tornado目录添加到py的环境变量 PYTHONPATH 中,这样就不需要编译setup.py(也就是不用安装的意思)

    安装条件:
    在py2.5 2.6 2.7上进行过测试,如果要使用 tornado 的全部功能,必须安装 PycURL (版本7.18.2 或者以上),对py2.5必须安装JSON支持组件simplejson,py2.6+以上的JSON支持已经在标准库内实现。


二、模块列表和简介:
    最重要的模块是web模块,他作为web框架包含了 Tornado 包内大部分的有用的东西,其他的工具和模块让web变的更有用

    主模块
        web – 用来创建FriendFeed的web框架,他集成(混合)了大部分 Tornado 的重要功能特征
        escape – XHTML, JSON, and URL 编解码方法
        database -对MySQLdb的简单封装,让mysql的使用更方便
        template – 基于python的模板渲染语言
        httpclient – 一个非阻塞http客户端,设计它用来和web和httpserver协同工作
        auth – 第三方认证和认证方案的实现 (Google OpenID/OAuth, Facebook Platform, Yahoo BBAuth, FriendFeed OpenID/OAuth, Twitter OAuth)
        locale – 本地化和翻译支持
        options – 命令行和配置文件解析工具,为了webserver环境做了优化

    底层模块
        httpserver – A very simple HTTP server built on which web is built
        iostream – A simple wrapper around non-blocking sockets to aide common reading and writing patterns
        ioloop – Core I/O loop

    随机模块:
        s3server – 一个实现了Amazon S3接口的web服务器,基于本地文件存储


三、Tornado使用概览
    一个 Tornado 应用会把URL或者URL模式映射到 tornado.web.RequestHandler 的子类,这些子类定义 get 和 set 方法来处理对应URL的GET和POST请求。


http://www.yaozinan.com/2011/04/tornado%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/?replytocom=15

 

==== 范例1 ==================================================
import tornado
import tornado.httpserver
import tornado.ioloop
import tornado.web
import os.path

# 申明一个 add 函数,提供给模板文件使用
def add(x, y):
    return (x+y)

# 网页访问处理
class MainHandler(tornado.web.RequestHandler):
    def get(self):
        items = ["item1","item2","item3", '222']
        # 第一个参数是模板文件,后面不但可以传递参数,还可以传递函数,可扩展性很好而且很强大。
        self.render("templates.html", items=items, add=add)

class StoryHandler(tornado.web.RequestHandler):
    def post(self, story_id):
        self.set_header("Content-Type", "text/plain") # 设置头部信息
        self.write("You wrote " + self.get_argument("message")) # get_argument方法接收参数

        # 不使用模板,则可直接把内容 write 出去
        self.write("You requested the story " + story_id)
        # 可以多次调用 write,把要显示的内容追加上去
        self.write("<input type='button' value='返回' onclick='window.history.back();'/>")

# 更多的访问处理方式
class IndexHandler(tornado.web.RequestHandler):
    # 处理post过来的数据,接收 service_method, argv 两个URL参数
    def post(self, service_method='', argv=''):
        print('method:POST...')
        print('service_method:' + service_method)

        # 参数处理,按斜杠划分成list
        if argv:
            if argv.startswith('/'): argv = argv[1:]
            if argv.endswith('/'): argv = argv[:-1]
        argv = argv.split('/') if argv else []
        print('argv:' + str(argv))

        print('request.arguments:' + str(self.request.arguments)) # form 表单提交的信息
        print('application:' + str(self.application))

        items = ["item1","item2","item3", 'dfsdfsd']
        self.render("templates.html", items=items, add=add)

    # 处理get提交过来的数据
    def get(self, service_method='', argv=''):
        print('method:GET....')
        self.post(service_method, argv)

    # post 和 get 处理之后的调用; data 是处理模板后的内容,string类型,调用self.write或者什么都不显示时为None
    def finish(self, data=None):
        print('finish   data:\n' + str(data))
        super(IndexHandler, self).finish(data)


# 找不到页面的处理
class NotFoundHandler(tornado.web.RequestHandler):
    def prepare(self):
        NOTFOUND_404 = "404.html" # 404文件地址
        if os.path.exists(NOTFOUND_404):
            #self.set_status(404) # 设 404 状态,浏览器可能会跳转到自己定义的找不到页面,要想全部显示一样就不要设置此状态
            self.render(NOTFOUND_404, url = self.request.full_url())
        else:
            self.send_error(404)


# 网址访问的配置
application = tornado.web.Application([
    (r"/", MainHandler),
    (r"/story/([0-9]+)", StoryHandler),
    (r'^/index/(?P<service_method>.*?)(?P<argv>/.*?)?', IndexHandler), # service_method, argv 两个URL参数可传递给函数处理
    (r"/.*", NotFoundHandler), # 找不到页面,必须放在最后
])

if __name__ == "__main__":
    http_server = tornado.httpserver.HTTPServer(application) # 加载配置
    http_server.listen(8088) # 监听端口号
    tornado.ioloop.IOLoop.instance().start() # 启动
    # 测试网址:
    # http://localhost:8088/
    # http://127.0.0.1:8088/story/555
    # http://127.0.0.1:8088/index/test/test2/kkkk

 


 

原创粉丝点击