认识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(五)
认识tornado(二)的更多相关文章
- web框架详解之tornado 二 cookie
一.tornado之cookie一 目录: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- Tornado(二)
跨站请求伪造CSRF 开启xsrf(就是叫法不一样和csrf一样),'xsrf_cookies':True settings = { 'template_path':'template', 'stat ...
- tornado 01 路由、输入与输出
tornado 01 路由.输入与输出 一.安装tornado pyvip@Vip:~$ workon py3env #安装python3的虚拟环境 (py3env) pyvip@Vip:~$ pip ...
- tornado框架的简单实用
一.安装模块 pip3 install tornado 二.简单的起服务的方法 import json, datetime from tornado.web import RequestHandler ...
- Python之Tornadoweb框架使用
本文主要讲解Tornadoweb框架的安装和介绍及其简单使用. 一. 安装介绍 Tornado是一个Python Web框架和异步网络库,最初是在FriendFeed上开发的.通过使用非阻塞网络I / ...
- pip下载加速的方式
两种方式 一.临时方式 可以在使用pip的时候加参数-i https://pypi.tuna.tsinghua.edu.cn/simple. 例如下载或者更新: 下载:pip install -i h ...
- Python框架之Tornado(二)请求阶段
概述 上图是tornado程序启动以及接收到客户端请求后的整个过程,对于整个过程可以分为两大部分: 启动程序阶段,又称为待请求阶段(上图1.2所有系列和3.0) 接收并处理客户端请求阶段(上图3系列) ...
- 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现
本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...
- tornado框架之路二
二.路由系统 路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类. #!/usr/bin/env pyth ...
- python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介
内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...
随机推荐
- 计算机文件基本上分为二种:二进制文件和 ASCII(也称纯文本文件)
文本文件是可以看到的字符, 二进制文件是不可视字符,如图片. 二进制文件: 包含在 ASCII及扩展 ASCII 字符中编写的数据或程序指令的文件.计算机文件基本上分为二种:二进制文件和 ASCII( ...
- 基于Python-Flask实现的网站例子
概述 使用Flask写的体育网站 包括(注册 论坛 文章评论 组建战队 后台管理)等功能 示例地址文中有写 萌新 请多指教 详细 代码下载:http://www.demodashi.com/demo/ ...
- mysql主从复制原理及实现
一.主从复制原理 利用MySQL提供的Replication,其实就是Slave从Master获取Binary log文件,然后再本地镜像的执行日志中记录的操作.由于主从复制的过程是异步的,因此Sla ...
- python 高级语法
#coding:utf-8 #定义一个装饰器函数 def doc_func(func): #包裹函数(闭包) def warpfunc(): #做一些额外的事情 print "%s call ...
- js操作注意事项
1.函数赋值给变量时,不能加括号 function fun() { ... } var str=fun; 2.js创建构造函数和调用对象,对象内不能用var 变量,只能用this function f ...
- Brackets - 前端编辑器推荐
Brackets是一款基于web(html+css+js)开发的web前端编辑器.它有许多普通编辑器难以实现的功能,是web前端开发者的神器. 戳我去下载 其功能如下: 1.快速编辑 将光标定在颜色上 ...
- dmesg命令应用
昨晚上线服务的时候,看log偶然发现服务在启动半小时左右就会被supervise重新拉起,也没有core.通过重新启动的服务发现内存飙涨,且持续增加,怀疑是内存打满,进程被kill了. 其实怀疑是正确 ...
- SMP
SMP(Symmetrical Multi-Processing):对称多处理技术,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构. 在smp系统中,所有的CP ...
- apue编程之getopt ,getopt_long使用方法以及实例
1.getopt 1.1 函数定义 int getopt(int argc, char * const argv[], const char *optstring);#include <unis ...
- Chapter 2 JavaScript Basic
Has 5 primitive types: Undefined, Null, Boolean, String, Number. typeof operator Undefined return u ...