认识tornado(二)

前面我们对 Tornado 自带的 hello world 作了代码组织上的解释,但是没有更加深入细致地解释。这里我们直接从main()函数开始,单步跟随,看看tornado都干了些什么。

下面是 main() 函数的定义:

1    def main():
2        tornado.options.parse_command_line()
3        application = tornado.web.Application([
4            (r"/", MainHandler),
5        ])
6        http_server = tornado.httpserver.HTTPServer(application)
7        http_server.listen(options.port)
8        tornado.ioloop.IOLoop.instance().start()

先从第一行开始:

1    tornado.options.parse_command_line()

这一句是解析命令行参数,函数定义在tornado/options.py里。注意,在options.py里有两个parse_command_line()的定义。一个是OptionParser类的成员函数:

1    class OptionParser(object):
2        def parse_command_line(self, args=None, final=True):

另一个是普通的函数,不过它的实现是直接调用OptionParser的实现。

1    def parse_command_line(args=None, final=True):
2        return options.parse_command_line(args, final=final) 

直接看OptionParser中的实现。简短的注释,parse_command_line()默认是解析sys.argv中的参数。我们在运行 helloworld.py时,后面跟的参数在这里处理。命令行参数的解析过程很简单,没有什么需要特别关注。再者,我们现在没有使用任何命令行参数,所 以先略过。

接下来:

1    application = tornado.web.Application([
2        (r"/", MainHandler), ]) 

这一句虽然简单,但信息量略大。首先,tornado.web.Application是一个tornado内置的类,定义在 tornado/web.py中。从它大段的注释就可以看出来,这个类至少是男二号。按tornado的说法,Application类实际是一些 Handler的集合,这些Handler组成了一个web应用程序。

什么是handler呢?

当用户访问你的网站时,它会提交一个URL,表示“把这个地址的数据给我”,这个URL可能是一张网页,比如http://abc.com /1.htm,也可能是一张图片,比如 http://abc.com/2.jpg 。数据被传送到浏览器后,经过渲染,就是大家看到的网站的样子。对每个这样的URL,在tornado上可以针对性的设置一个函数来处理。 比如http://abc.com/1.htm我们就交给一个叫handle_1_htm()的函数,http://abc.com/2.jpg交给一个 叫handle_2_jpg()的函数。它们分别负责将客户请求的内容通过http协议返回给客户端。这些函数,就叫handler。

相比于普通的静态http,这种handler机制提供了更多的灵活性。比如,1.htm可能每次都是根据数据库中内容动态生成的,再返回给用户的 资料可以每次都不一样。又比如:可能服务器上根本不存在2.jpg这样一个文件,handle_2_jpg()函数实际上从服务器连接的摄像头上去拍一张 图来,然后返回给用户。用tornado开发网站,大部分的工作都是在写这样的 handler

上面这一句,是初始化了一个Application的实例,保存在application变量中。

Application的初始化参数是非常讲究的。在Application类的说明里,大段的话都是在讲参数的事。

示例中的参数比较简单:

1    application = tornado.web.Application([(r"/", MainHandler), ])

我们看Applicatino类的__init__函数原型:

1    def __init__(self, handlers=None, default_host="", transforms=None, wsgi=False, **settings): 

可见helloword.py只提供了handlers这个参数值。handlers实际上是一个列表,每个元素是 (regexp,tornado.web.RequestHandler)这样的tuple。前面讲过,handler与用户请求之间存在映射关系,这个 关联就是在这里定义的。

1    (r"/", MainHandler)

这就表示,如果用户请求的是网站根目录,就调用MainHandler来处理。前面我们直接输入 http://127.0.0.1:8888 ,其实就是访问的根目录,我们看到的hello world输出就是由MainHandler输出的。后面分析MainHandler时再详述。

如果我们访问一个没有定义handler的URL(比如http://127.0.0.1/1.htm )会发生什么?

很简单,告诉你找不到!再做个实验,把

1    application = tornado.web.Application([(r"/", MainHandler),])

改成:

1    application = tornado.web.Application([ (r"/hello\.htm", MainHandler), ]) 

注意,因为是正则式,所以我们在点号前加了反斜杠。再尝试访问http://127.0.0.1:8888,会404了。

换我们改过的URL,http://127.0.0.1:8888/hello.htm,可爱的“hello world”又回来了。

现在你应该理解handler是怎么回事了。

同时这提醒我们,浏览器地址栏中的URL并不一定表示服务器上真的就存在这样一个文件。它完全可能是web服务器上虚拟映射的一个路径而已。比如刚才的hello.htm。

由于这是hello world级别的示例,所以handler只有一个,且非常之简单。

认识tornado(一)
认识tornado(二)
认识tornado(三)
认识tornado(四)
认识tornado(五)

来源:http://www.nowamagic.net/academy/detail/1332566

时间: 2024-12-22 12:06:47

认识tornado(二)的相关文章

Tornado(二)

跨站请求伪造CSRF 开启xsrf(就是叫法不一样和csrf一样),'xsrf_cookies':True settings = { 'template_path':'template', 'static_path':'static', 'static_path_prefix':'/static/', 'xsrf_cookies':True, } 在post表单中增加csrf认证 <!DOCTYPE html> <html lang="en"> <head

tornado—–Handler Url正则

转自:http://my.oschina.net/jiemachina/blog/204878 tornado(二)—–Handler Url正则 handler url正则匹配, get/post 1. 简单 application = tornado.web.Application([ (r'/', MainHandler) ], **settings) 2. 带有参数 class ProfileHandler(RequestHandler): def initialize(self, da

Tornado之初学者(一)

Tornado特点一句话简介:Tornado是非阻塞式的Web服务器,速度非常快,每秒可以处理数以千计的链接,因此Tornado是实时Web服务的一个理想框架. 一.安装Tornado使用pip安装即可:pip install tornado 二.运行Tornado的helloworld所需的基本组成 #!/usr/bin/env python # -*- coding: utf-8 -*- import tornado.web import tornado.ioloop # 用于处理网页的请求

tornado 01 路由、输入与输出

一.安装tornado [email protected]:~$ workon py3env #安装python3的虚拟环境 (py3env) [email protected]:~$ pip install tornado #安装tornado 二.使用tornado #创建一个py文件,然后在虚拟机中打开文件即可 #要让服务一直在运行当中,这就要用到tornado.ioloop模块 #为了便于开发,就要用到tornado.web模块 import tornado.ioloop #开启循环,让

tornado框架的简单实用

一.安装模块 pip3 install tornado 二.简单的起服务的方法 import json, datetime from tornado.web import RequestHandler, Application from tornado.ioloop import IOLoop from tornado.httpserver import HTTPServer from tornado.options import define, options # 异步 import torn

pip下载加速的方式

两种方式 一.临时方式 可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple. 例如下载或者更新: 下载:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tornado 更新:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade tornado 二.永久修改 如果你不想临时使用,想永久性的,那么

Python框架之Tornado(二)请求阶段

概述 上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分: 启动程序阶段,又称为待请求阶段(上图1.2所有系列和3.0) 接收并处理客户端请求阶段(上图3系列) 简而言之: 1.在启动程序阶段,第一步,获取配置文件然后生成url映射(即:一个url对应一个XXRequestHandler,从而让XXRequestHandler来处理指定url发送的请求):第二步,创建服务器socket对象并添加到epoll中:第三步,创建无线循环去监听epoll. 2.在

web(二)---tornado模板

一. 接上两节, 修改index.py如下: 增加了/index.py/template和处理句柄. import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") class TemplateHandler(tornado.web.RequestHandler): def get(self)

Tornado/Python 学习笔记(二)

部分ssrpc.py代码分析 -- 服务端: 1 #!/usr/bin/python3 2 3 from xmlrpc.client import Fault, dumps, loads 4 import sys 5 from socketserver import ForkingMixIn 6 from xmlrpc.server import SimpleXMLRPCServer 7 8 class VerboseFaultXMLRPCServer(SimpleXMLRPCServer):