tornado web 应用程序通常包含一个或者多个RequestHandler 子类,一个Application 对象来为每个控制器路由到达的请求和一个mian()函数

import tornado.ioloop
import tornado.web class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world") def make_app():
return tornado.web.Application([
(r"/", MainHandler),
]) if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()

Application 对象

Application 对象是负责全局的设置,包括用来转发请求和控制器的路由表

路由表是一些的url对象,其中包括正则,参数等,如果一个字典当做url被传递到第三个参数中时,它将作为初始参数传递给RequestHandler.initialize 最后url可能会有一个名字允许和RequestHandler.reverse_url 一起使用

  

RequestHandler 子类

大多数tornado.web 应用程序的工作都是在RequestHandler子类中完成的,对于一个控制器子类来说主入口点被get()和post()等这个的HTTP方法控制着

许多RequestHandler.render 或者RequestHandler.write 将会产生一个相应的render(),通过名字作为参数加载Template.write(),将产生一个不适用模本的纯输出,它接收字符串,字节系列和字典等

许多RequestHandler中的方法被设计成为能够在子类中覆盖方法以在整个应用程序中使用,通常定义BaseHandler类来覆盖writ.error  和get_current_user 然后继承时,使用的是BaseHandler

处理输入请求

处理输入请求可以用self.request

通过 HTML 表单形式的数据可以利用 get_query_argument 和 get_body_argument 等方法来转换

RequestHandler 可以明确的声明想要的是一个值还是一个列表. 对于列表来说, 使用 get_query_arguments 和 get_body_arguments

通过 self.request.files 可以实现文件上传

由于 HTML 的编码形式十分古怪 (例如. 不区分单一参数还是列表参数), Tornado 不会试图去统一这些参数. 特别的, 我们不会解析 JSON 请求的请求体. 应用程序希望使用 JSON 在编码上代替prepare 来解析它们的请求:

def prepare(self):
if self.request.headers["Content-Type"].startswith("application/json"):
self.json_args = json.loads(self.request.body)
else:
self.json_args = None

覆盖 RequestHandler 的方法

  

  1. initialize() 在 Application 的初始化配置参数下被调用. initialize 通常只保存成员变量传递的参数; 它将不会产生任何输出或者调用像 send_error 一样的方法.
  2. prepare() 被调用. 这时基类在与子类共享中最有用的一个方法, 不论是否使用了 HTTP 方法prepare 都将会被调用. prepare 可能会产生输出; 如果她调用了 finish (或者 redirect, 等等), 处理会在这终止.
  3. HTTP方法将会被调用: get()post()put(), 等等. 如果 URL 正则表达式中包含匹配组, 它们将被传递当这些方法的参数中.
  4. 当这些请求结束以后, 会调用 on_finish() . 对于同步处理来说调用会在 get() (等) 返回后立即执行; 对于异步处理来说这将会发生在调用 finish() 之后.

所有像这样可以被覆盖的方法都记录在 RequestHandler 的文档中. 其中一些最常用的覆盖方法有:

重定向

  

在 Tornado 中重定向有两种重要的方式: RequestHandler.redirect 和利用 RedirectHandler.

你可以在 RequestHandler 中使用 self.redirect() 把用户重定向到其它地方. 可选参数 permanent可以定义这个跳转是否时永久的.

RedirectHandler 可以在你的 Application 路由表中直接设置跳转. 例如, 设置一条静态跳转:

app = tornado.web.Application([
url(r"/app", tornado.web.RedirectHandler,
dict(url="http://itunes.apple.com/my-app-id")),
])

异步处理

使用异步处理程序的最简单方式是使用 coroutine 修饰符. 这将会允许你通过关键字 yield 生成一个 非阻塞 I/O,

在某些时候, 协程可能不如一些基于回调的方式更方便, 在这些情况下 tornado.web.asynchronous 修饰符可以被取代. 这个修饰符通常不会自动发送应答; 相反请求将会被保持直到有些回调函数调用RequestHandler.finish. 这取决于应用程序来保证方法是会被掉用的, 否则用户的请求将会被简单的挂起.

c

class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
http = tornado.httpclient.AsyncHTTPClient()
http.fetch("http://friendfeed-api.com/v2/feed/bret",
callback=self.on_response) def on_response(self, response):
if response.error: raise tornado.web.HTTPError(500)
json = tornado.escape.json_decode(response.body)
self.write("Fetched " + str(len(json["entries"])) + " entries "
"from the FriendFeed API")
self.finish()

参考http://tornado-zh-cn.readthedocs.io/zh_CN/latest/guide/structure.html

tornado web应用程序结构的更多相关文章

  1. 了解ASP.NET5 Web应用程序结构

    本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ASP.NET 5 针对WEB编程引 ...

  2. 理解Web应用程序的代码结构和运行原理(3)

    1.理解Web应用程序的运行原理和机制 Web应用程序是基于浏览器/服务器模式(也称B/S架构)的应用程序,它开发完成后,需要部署到Web服务器上才能正常运行,与用户交互的客户端是网页浏览器. 浏览器 ...

  3. NET5 Web应用程序

    ASP.NET5 Web应用程序结构 本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ...

  4. 阅读笔记——Web应用程序

    Web应用程序与DD文件 Web应用程序 web应用程序是一种可以通过Web访问的应用程序.Web应用程序最大的好处是永和很容易访问应用程序.用户只需要有浏览器即可,不需要安装其他任何软件.一个Web ...

  5. (译)Web是如何工作的(2):客户端-服务器模型,以及Web应用程序的结构

    原文地址:https://medium.freecodecamp.org/how-the-web-works-part-ii-client-server-model-the-structure-of- ...

  6. 一步步构建.NET Core Web应用程序---基本项目结构

    前言 随着.NET Core日益成熟, 我作为C#&.NET体系中的一份子也加入了.NET Core 这一体系中,随着不断学习, 接触到的各种框架日益庞杂,接下来我会由一个新手的角度把整个基于 ...

  7. Go Web 编程之 程序结构

    概述 一个典型的 Go Web 程序结构如下,摘自<Go Web 编程>: 客户端发送请求: 服务器中的多路复用器收到请求: 多路复用器根据请求的 URL 找到注册的处理器,将请求交由处理 ...

  8. ASP.NET WEB应用程序(.network4.5)MVC 程序的结构解读1

    https://www.cnblogs.com/-beauTiFul/p/8036509.html 简介 开发环境:VS2015 ASP.NET:可以开发出几乎所有运行在Windows上的应用程序:. ...

  9. tornado web 框架的认识

    tornado 简介 1,概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的 ...

随机推荐

  1. string.erase()--已解决

    在代码中需要实现这样一个功能,需要将[00000001]这个存储在string中的字符串的中括号去掉,首先想到的就是string.erase()这个函数.结果... 代码: #include < ...

  2. 分析并实现 360 P1路由器上的朋友专享网络 功能

    笔者分析了360 P1路由器上的朋友专享网络功能,发现其主要由如下子功能组成: 1. APP点击“立即开启”,则路由器会多出一个新的SSID:360朋友专享网络-8463.此SSID不加密:同时,原有 ...

  3. Supervisord进程管理工具

    进程管理工具Supervisord Posted on 2014/06/17 by admin Supervisord 上面已经介绍了Go目前是有两种方案来实现他的daemon,但是官方本身还不支持这 ...

  4. 【JMeter性能测试】之学习资料总结(持续更新)

    本人测试小白,总结一下JMeter性能测试相关文档进行转载学习,下面会贴出原文作者以示感谢: JMeter性能测试学习地址:http://www.ltesting.net/ceshi/open/kyx ...

  5. 第一百五十六节,封装库--JavaScript,延迟加载

    封装库--JavaScript,延迟加载 延迟加载的好处,就是在浏览器视窗外的图片,不加载,拖动鼠标到浏览器视窗内后加载,用户不看的图片就不用加载,可以减少服务器大量流量 将图片的src地址用一张统一 ...

  6. 对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的?

    对hibernate的延迟加载如何理解,在实际应用中,延迟加载与session关闭的矛盾是如何处理的? 解答:延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载.那么Hibernat ...

  7. 嵌入式驱动开发之dsp 算法优化vlib emcv---算法优化

    http://www.opencv.org.cn/forum.php?mod=forumdisplay&fid=9

  8. js节流防抖应用场景,以及在vue中节流防抖的具体实现

    故事背景: 项目有个需求是输入框在输入的时候进行搜索,展示下拉数据,但是没必要输入一个字都进行搜索,所以想到了在输入结束200毫秒后再进行搜索,从而引出来了 js的节流(throttle),防抖(de ...

  9. asp.net 读取配置文件方法

    方法1: System.Collections.Specialized.NameValueCollection nvc = (System.Collections.Specialized.NameVa ...

  10. 【链接】LINUX SHELL脚本攻略笔记[速查]

    LINUX SHELL脚本攻略笔记[速查]