Tornado简介
Tornado是一个具有强大异步功能的Python Web框架.
Hello World
使用pip安装tornado:
pip install tornado
编写控制器:
import tornado.httpserver
import tornado.ioloop
import tornado.options
from tornado.web import RequestHandler
from tornado.options import define, options
define("port", default=8000, help="run on the given port", type=int)
class IndexHandler(RequestHandler):
def get(self):
self.write('Hello World!')
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
在命令行中运行:
python hello.py --port=8000
在浏览器中访问http://localhost:8000, 可以看到来自服务器的Hello World.
Web.Application
每一个torndao服务端程序均使用Application封装:
define("port", default=8000, help="run on the given port", type=int)
if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
常量定义:
define("port", default=8000, help="run on the given port", type=int)
解析命令行参数并进行配置options:
tornado.options.parse_command_line()
Web.Application的handler关键字参数是一个列表,列表中的元素是(地址正则表达式,handler类)二元组
handlers=[(r"/", IndexHandler)]
初始化httpserver:
http_server = tornado.httpserver.HTTPServer(app)
绑定服务器监听的端口:
http_server.listen(options.port)
启动IO循环来接收请求并处理:
tornado.ioloop.IOLoop.instance().start()
RequestHandler
Tornado开发的核心是继承RequestHandler类,并重写get, post等方法实现对相应HTTP请求的响应。
返回响应
一般情况下不需要get或post方法返回任何值, 使用self.write(chunk)可以直接将块写入缓冲区, chunk参数可以是str或dict对象.
若chunk是一个dict对象, tornado会将其序列化JSON字符串同时会把响应头设置为application/json.
RequestHandler.render(template_name, **kwargs)会渲染模板并将结果返回客户端:
class PageHandler(RequestHandler):
def get(self):
self.render('./templates/index.html')
若要对渲染结果进行处理则可以使用RequestHandler.render_string(template_name, **kwargs)获得渲染结果字符串, 并在处理后手动写入缓冲区.
RequestHandler.redirect(url, permanent=False, status=None)方法可以将请求重定向到其它url.
如果指定了status参数, 这个值将作为HTTP状态码; 否则,将通过 permanent 参数选择301 (永久) 或者 302 (临时). 默认是 302 (临时重定向).
RequestHandler.set_status(status_code, reason=None)方法可以设置响应的状态码, reason参数用人类可读的原因短语来描述状态码. 如果reason是None, 会自动使用httplib.responses 的reason.
RequestHandler.set_header(name, value)和add_header(name, value)可以设置或添加响应头中的参数.
RequestHandler.flush(callback=None)刷新缓冲区然后执行回调.
RequestHandler.finish(chunk=None)将返回response并断开连接, 一般在响应方法退出时自动执行.
获得请求参数
get和post方法默认只有一个self参数, 而url中被匹配的字符串会被作为位置参数传入:
handlers = [("user/([0-9]+)", UserInfoHandler)]
class UserInfoHandler(Requesthandler):
def get(self, uid):
self.write(str(uid))
RequestHandler.get_body_argument(name)可以返回请求body部分中的参数,比如post方法提交的参数,.
RequestHandler.get_query_argument(name)可以获得包含url中的参数, 一般为get方法提交的参数.
RequestHandler.get_argument(name)则可以获得body或query参数.
class LoginHandler(RequestHandler):
def post(self):
username = self.get_argument('username')
password = self.get_argument('password')
result = do_login(username, password)
self.write(result)
RequestHandler.request 对象封装HTTP请求的信息, request.arguments以字典的形式包含了所有body和query参数.
request.headers.get(name, default=None)则可以用来获得在请求头中的参数.
request.files可以获得上传文件的信息, 先编写上传表单:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Upload</title>
</head>
<body>
<form action="/do-upload/" method="post" enctype="multipart/form-data">
<input type="file" name="filename">
<input type="submit" value="submit">
</form>
</body>
</html>
实现handler:
class UploadFileHandler(RequestHandler):
def post(self):
upload_path = os.path.join(os.path.dirname(__file__),'files')
filemeta = self.request.files['filename'][0]
filename = filemeta['filename']
path = os.path.join(upload_path, filename)
with open(filepath,'wb') as fw:
fw.write(meta['body'])
self.write('upload success')
cookie
RequestHandler.cookies 存储cookie的字典, 等同于self.request.cookies.
RequestHandler.get_cookie(name, default=None) 获取给定name的cookie值, 如果未获取到则返回默认值.
RequestHandler.set_cookie(name, value)设置给定的cookie 名称/值还有其他给定的选项.
RequestHandler.clear_cookie(name, path='/', domain=None)删除给定名称的cookie.受cookie协议的限制,必须传递path和domain来清除这个cookie.
RequestHandler.clear_all_cookies(path='/', domain=None)删除用户在本次请求中所有携带的cookie.
tornado的cookie系统同样提供了含有数字签名的时间戳的secure_cookie系统.其操作与普通cookie类似:
class AuthHandler(RequestHandler):
def get(self, redirect_uri):
uid = self.get_secure_cookie('uid')
token = make_token(uid)
self.set_secure_cookie('token', token)
self.redirect("/" + redirect_uri)
参考资料:
Tornado简介的更多相关文章
- Python Tornado简介
简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- 01-tornado学习笔记-Tornado简介
01-Tornado简介 Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用 ...
- 01-tornado练习-tornado简介
# coding = utf-8 """ 启动一个tornado的web服务 """ import tornado.web from tor ...
- tornado web 框架的认识
tornado 简介 1,概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的 ...
- 浅析tornado web框架
tornado简介 1.tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web 服务器框架(包括大多数 Py ...
- tornado web框架
tornado web框架 tornado简介 1.tornado概述 Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本.Tornado 和现在的主流 Web ...
- Tornado基本应用
Tornado简介 Tornado有自己的socket(异步非阻塞,原生支持WebSocket),Django没有. Tornado的模板语言更接近Python风格,比Django要好理解. Demo ...
- Python之tornado
一.快速了解Tornado框架 1)tornado简介 Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快.得利于其 ...
- 20-2 树莓派搭建服务器 Tornado Web服务器
Drive.google.com/drive/folders/1ahbeoEHkjxoo4NV1wReOmpoRWbl448z- 1.Tornado简介 Tornado一款使用 Python 编写的, ...
随机推荐
- [翻译]ASP.NET Web API 2 中的全局错误处理
目录 已存在的选项 解决方案预览 设计原则 什么时候去用 方案详情 示例 附录: 基类详情 原文链接 Global Error Handling in ASP.NET Web API 2 由于翻译水平 ...
- 构建NetCore应用框架之实战篇(六):BitAdminCore框架架构小结
本篇承接上篇内容,如果你不小心点击进来,建议从第一篇开始完整阅读,文章内容继承性连贯性. 构建NetCore应用框架之实战篇系列 一.小结 1.前面已经完成框架的第一个功能,本篇做个小结. 2.直接上 ...
- C# 调用微信接口的代码
调用微信接口前需要准备的内容. 1.微信公众平台的appid 2.微信公众平台的secret 3..获取tokenid 4.获取ticket 5.生成签名的随机串 6.生成签名的时间戳 7.生成签名 ...
- MYsql 之单标查询.
http://www.cnblogs.com/wangfengming/articles/8064956.html .数据操作 .增 INSERT into t2(name,age) VALUES() ...
- Day 12 装饰器,开发封闭.
一.什么是装饰器 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事务 ...
- Svn和jekins的使用
首先是svn的安装, 在安装svn的服务端时,需要注意选择第二项,这样才能在idea中使用svn, 然后就是在idaa中配置svn插件. 插件的使用 从svn库中检出项目 然后在这个地址中填入你需要导 ...
- (进阶篇)PHP(thinkphp5框架)实现用户注册后邮箱验证,激活帐号
本文将结合实例,讲解如何使用thinkphp5+Mysql完成注册帐号.发送激活邮件.验证激活帐号.处理URL链接过期的功能. 业务流程 1.用户提交注册信息. 2.写入数据库,此时帐号状态未激活. ...
- GitHub项目加入Travis-CI的自动集成
Travis-CI是为github量身打造的自动集成环境,如果我们的项目托管在github上,可以十分方便的使用Travis-CI做自动集成. 使用Travis-CI十分的简单,首先打开Travis- ...
- 查看服务器CPU的个数、CPU的核数、多核超线程数、机器硬件型号
这里有几个概念: 1.一台物理机的物理CPU的个数 2.一个CPU上的核数 3.一个核上面支持的线程数 有下面的计算公式: # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 ...
- objc_msgSend 作用
C 的函数调用方式 C 语言使用静态绑定,即在编译器就可以决定运行时所应调用的函数. 编译器在编译代码的时候就已经知道程序中有相应的函数,并直接生成调用函数的指令.函数地址硬编码在指令之中. OC 中 ...