tornado web应用程序结构
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 的方法
initialize()
在Application
的初始化配置参数下被调用.initialize
通常只保存成员变量传递的参数; 它将不会产生任何输出或者调用像send_error
一样的方法.prepare()
被调用. 这时基类在与子类共享中最有用的一个方法, 不论是否使用了 HTTP 方法prepare
都将会被调用.prepare
可能会产生输出; 如果她调用了finish
(或者redirect
, 等等), 处理会在这终止.- HTTP方法将会被调用:
get()
,post()
,put()
, 等等. 如果 URL 正则表达式中包含匹配组, 它们将被传递当这些方法的参数中. - 当这些请求结束以后, 会调用
on_finish()
. 对于同步处理来说调用会在get()
(等) 返回后立即执行; 对于异步处理来说这将会发生在调用finish()
之后.
所有像这样可以被覆盖的方法都记录在 RequestHandler
的文档中. 其中一些最常用的覆盖方法有:
write_error
- 输出一个HTML的出错信息on_connection_close
- 当与客户端断开时会被调用; 应用程序将会检查这种情况并且停止后续的处理. 要注意这里无法保证客户端断开时可以立刻被检测到.get_current_user
- 详见 用户认证get_user_locale
- 给当前用户返回一个Locale
对象set_default_headers
- 可以用来设置 在回应时的附加首部 (例如可以定制Server
首部)
重定向
在 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应用程序结构的更多相关文章
- 了解ASP.NET5 Web应用程序结构
本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ASP.NET 5 针对WEB编程引 ...
- 理解Web应用程序的代码结构和运行原理(3)
1.理解Web应用程序的运行原理和机制 Web应用程序是基于浏览器/服务器模式(也称B/S架构)的应用程序,它开发完成后,需要部署到Web服务器上才能正常运行,与用户交互的客户端是网页浏览器. 浏览器 ...
- NET5 Web应用程序
ASP.NET5 Web应用程序结构 本文参考ASP.NET5 官方文档 Understanding ASP.NET 5 Web Apps,加入了一些个人理解,理解不对的地方希望大家能指出,互相学习. ...
- 阅读笔记——Web应用程序
Web应用程序与DD文件 Web应用程序 web应用程序是一种可以通过Web访问的应用程序.Web应用程序最大的好处是永和很容易访问应用程序.用户只需要有浏览器即可,不需要安装其他任何软件.一个Web ...
- (译)Web是如何工作的(2):客户端-服务器模型,以及Web应用程序的结构
原文地址:https://medium.freecodecamp.org/how-the-web-works-part-ii-client-server-model-the-structure-of- ...
- 一步步构建.NET Core Web应用程序---基本项目结构
前言 随着.NET Core日益成熟, 我作为C#&.NET体系中的一份子也加入了.NET Core 这一体系中,随着不断学习, 接触到的各种框架日益庞杂,接下来我会由一个新手的角度把整个基于 ...
- Go Web 编程之 程序结构
概述 一个典型的 Go Web 程序结构如下,摘自<Go Web 编程>: 客户端发送请求: 服务器中的多路复用器收到请求: 多路复用器根据请求的 URL 找到注册的处理器,将请求交由处理 ...
- ASP.NET WEB应用程序(.network4.5)MVC 程序的结构解读1
https://www.cnblogs.com/-beauTiFul/p/8036509.html 简介 开发环境:VS2015 ASP.NET:可以开发出几乎所有运行在Windows上的应用程序:. ...
- tornado web 框架的认识
tornado 简介 1,概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的 ...
随机推荐
- WEB前端面试题 分别使用2个、3个、5个DIV画出一个大的红十字
<!DOCTYPE html> <!--两个DIV--> <html> <body> <div style="width:100%;he ...
- rdb 和 aof
Redis 中 默认会开启rdb 持久化方式,aof 默认不开启,Redis 提供不同级别的持久化方式rdb: 在指定的时间间隔对你的数据进行快照存储aof:记录每次Redis服务写操作,当Redis ...
- Linux下出现Read-only file system的解决办法
正常运行中的网站,忽然间出现session目录不可写,连接服务器一看,任何关于写硬盘的命令都不能用,提示Read-only file system,使用一条命令即可搞定此问题: mount -o re ...
- centos7.4 update git
1. 查看 yum 源仓库的 Git 信息: yum info git 输入如下内容: Available Packages Name : git Arch : x86_64 Version : 1. ...
- .net 编译原理
这听起来像是个非常高大上的名字,上学的时候我们学过的编译原理或者编译技术实际上是在讲如何将高级程序语言如C++编译为计算机可以理解的汇编语言,这里说的编译原理只是想说明在.NET的世界里编译这件事儿和 ...
- Apple设备中point,磅(pt),pixel的关系与转换,以及iPhone模拟器与真机的长度关系
查阅了好多资料都没有发现有相关的详细介绍,包括苹果官方文档,也是草草带过.后来是在一个介绍Macbook打印字体的博客中看到的,受到启发. 首先说明苹果设备绘图的长度单位可以认为是point,不是磅( ...
- CodeSmith自动生成代码使用
官网地址:http://www.codesmithtools.com/ CodeSmith开发系列资料总结 http://terrylee.cnblogs.com/archive/2005/12/28 ...
- phpQuery对数据信息的采集进一步学习
前提:需要下载:phpQuery/phpQuery.php 链接:http://www.cnblogs.com/wuheng1991/p/5145398.html 1.对于规则的部分 <?php ...
- java网络编程4-ServerSocket
//端口号为0则系统随机分配端口,连接队列系统一般默认50,指过超过系统最大的就以系统为准 //如果客户端的连接超过连接队列,则会被主机拒绝 ServerSocket serverSocket=new ...
- ChemDraw 15.1 Pro插入阿尔法可以这样做
在理工科学科学习过程中,大家都会遇到各种希腊字母,而阿尔法(α)又是最常见的一个.最新版本ChemDraw 15.1 Pro的功能更加卓越,在很多功能上都进行了优化,操作更简便.其中,就可以很好的在公 ...