Tornado的搭建很简单,使用pip,或者下载源码均可。

 

我们先看一个最简单的程序:

import tornado.ioloop
import tornado.web class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("<h1>Hello World<h1>") application = tornado.web.Application([(r"/", MainHandler),]) if __name__ == '__main__':
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

我们运行这个程序,打开浏览器输入:

http://localhost:8888/

就可以看到加粗的helloworld。

 

那么这段代码到底什么意思:

我们先看

class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")

这里定义了一个处理器,里面定义个一个get方法,对应Http协议中的GET请求。

然后是:

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

这里的含义是:如果用户输入的路径是“/”,也就是根路径,那么将使用我们刚才编写的MainHandler,如果该请求使用的GET,那么调用MainHandler的get方法,如果是POST请求,则去调用MainHandler中的post方法。

 

所以我们输入上面的网址,tornado调用了MainHandler中的get方法,返回"<h1>Hello World<h1>"

 

我们再看一个稍微复杂的程序:

import tornado.ioloop
import tornado.web class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("<h1>This is Home Page!</h1>") class StoryHandler(tornado.web.RequestHandler):
def get(self, story_id):
self.write("You request the story <h1>" + story_id + "</h1>") application = tornado.web.Application([
(r"/", MainHandler),
(r"/story/([0-9]+)", StoryHandler),
]) if __name__ == '__main__':
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

上面代码的含义是:

对于/根目录,使用MainHandler,处理GET请求。

对于/story/99这种,使用StoryHandler,处理GET请求。

下面看一个更加复杂的程序:

import tornado.ioloop
import tornado.web class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("<h1>This is Home Page!</h1>") class StoryHandler(tornado.web.RequestHandler):
def get(self, story_id):
self.write("You request the story <h1>" + story_id + "</h1>") class MessageHandler(tornado.web.RequestHandler):
def get(self):
self.write('''
<html>
<head>
<title>Please Input Message</title>
</head>
<body>
<form action="/message" method="post">
<input type="text" name="message"><br>
<input type="submit" value="submit">
</form>
</body>
</html>'''
)
def post(self):
#self.set_header("Content-Type", "text/plain")
self.write("You wrote <h1>" + self.get_argument("message") + "</h1>") application = tornado.web.Application([
(r"/", MainHandler),
(r"/story/([0-9]+)", StoryHandler),
(r"/message", MessageHandler),
]) if __name__ == '__main__':
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()

这里,输入/message这个URL,使用的是MessageHandler,调用其中的get方法,返回一段HTML代码,其中含有一个表单,提交后,仍使用/message,但是此时采用POST请求提交。后端Tornado收到这段数据,采用MessageHandler的post方法,处理这段文本,将其回显给用户。

Tornado框架的初步使用的更多相关文章

  1. python tornado框架实现CRUD

    1.本例采用postgresql数据库,创建数据表 user_tbl ),signup_date date); 2.webapi接口 (1)tornado框架配置 t_tornado.py #-*- ...

  2. python运维开发(二十三)---tornado框架

    内容目录: 路由系统 模板引擎 cookie 加密cookie 自定义api 自定义session 自定义form表单验证 异步非阻塞 web聊天室实例 路由系统 路由系统其实就是 url 和 类 的 ...

  3. python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介

    内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...

  4. Tornado框架简介

    -------------------简介------------------- 1.概念:     Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器 ...

  5. tornado框架源码分析---Application类之debug参数

    先贴上Application这个类的源码. class Application(httputil.HTTPServerConnectionDelegate): """A ...

  6. Tornado框架配置使用Jinja2模板引擎

    安装jinja2包 pip install jinja2 定义继承tornado.web.RequestHandler的子类BaseHandler.如果请求处理类继承这个类将会使用jinja模板引擎: ...

  7. tornado框架学习及借用有道翻译api做自动翻译页面

    趁着这几天有时间,就简单的学了一下tornado框架,简单做了个自动翻译的页面 仅为自己学习参考,不作其他用途 文件夹目录结构如下: . ├── server.py ├── static │   └─ ...

  8. tornado框架&三层架构&MVC&MTV&模板语言&cookie&session

    web框架的本质其实就是socket服务端再加上业务逻辑处理, 比如像是Tornado这样的框架. 有一些框架则只包含业务逻辑处理, 例如Django, bottle, flask这些框架, 它们的使 ...

  9. 03: 自定义异步非阻塞tornado框架

    目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 源码 1 ...

随机推荐

  1. python通过多进程实行多任务

    #原创,转载请联系 在开始之前,我们要知道什么是进程.道理很简单,你平时电脑打开QQ客户端,就是一个进程.再打开一个QQ客户端,又是一个进程.那么,在python中如何用一篇代码就可以开启几个进程呢? ...

  2. eclipse出现build path 错误

    右击本项目-build path-config build path-libraries-发现有选项是带错误符号,于是点击edit然后点击alternative jre选择安装了的jre就解决问题了

  3. linux查看cpu内存信息

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  4. HDU 2102 A计划【三维BFS】

    A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissio ...

  5. 用JDBC操作MySQL——获取表的大小

    JDBC中获取MySQL我们有时需要获得表的大小,这包括了表的行数和列数,我们可以分别用以下的方法得到: 假设我们得到了一个ResultSet对象rs,则操作如下: 读取结果集前获取行数: rs.la ...

  6. java应用高内存占用

    在java虚拟机中,内存分为三个代:新生代(New), 老生代(Old).永久代(Perm) 新生代: 新建的对象都存放这里老生代:存放从新生代中迁移过来的生命周期较久的对象.新生代和老生代共同组成了 ...

  7. [BZOJ2527]Meteors

    整体二分挺好玩的...学一发 这个询问显然是可以二分的,但每次都二分就会T爆,所以我们有了“整体”二分 每次处理一些询问,要求这些询问的答案一定在$[l,r]$中 先把$l$到$mid$的操作实施,那 ...

  8. 【状压DP】旅行商问题

    给定一张带权有向图,要求从顶点0出发,经过每个结点恰好一次后再返回0,求边权和的最小值. 2<=n<=15 0<=d(i,j)<=1000 样例 5 80 1 30 3 41 ...

  9. 【博弈论】bzoj1115 [POI2009]石子游戏Kam

    差分后与阶梯博弈很类似. #include<cstdio> using namespace std; int n,T,a[1001],ans; int main() { scanf(&qu ...

  10. python3 开发面试题(常用模块以及第三方库)6.5

    """ 1. os和sys都是干什么的? 2. 你工作中都用过哪些内置模块? 3. 有没有用过functools模块? """ #sys模块 ...