Tornado 框架的使用
Tornado
tornado是一个轻量级python的web框架,他是非阻塞式的,而且速度非常快.得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。
1.最根本的使用
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
application = tornado.web.Application([
(r"/index", MainHandler),
])
if __name__ == "__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
2.路由系统
tornado的路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类。
application = tornado.web.Application([
(r"/index", MainHandler),
(r"/story/([0-9]+)", StoryHandler),
])
application.add_handlers('news.baidu.com$', [
(r'/index',NewsHandler),
])
Tornado中原生支持二级域名的路由
3.模版引擎
Tornado 的模板支持“控制语句”和“表达语句”,控制语句是使用 {% 和 %} 包起来的
例如 {% if len(items) > 2 %}。
表达语句是使用 {{ 和 }} 包起来的,
例如 {{ items[0] }}。
Tornado控制语句和对应的 Python 语句的格式基本完全相同。我们支持 if、for、while 和 try,这些语句逻辑结束的位置需要用 {% end %} 做标记。还通过 extends 和 block 语句实现了模板继承。
在使用模板前需要在setting中设置模板路径:"template_path" : "tpl"
例如:
逻辑语句
<ul>
{% for item in list_info %}
<li>{{item}}</li>
{% end %}
</ul>
-----------------------------------------
继承母版
{% block RenderBody %}{% end %}
{% block RenderBody %}
<h1>Index</h1>
在这里写内容
{% end %}
-----------------------------------------
导入固定的小组件
{% include 'header.html' %}
在模板中默认提供了一些函数、字段、类以供模板使用:
escape: tornado.escape.xhtml_escape 的別名
xhtml_escape: tornado.escape.xhtml_escape 的別名
url_escape: tornado.escape.url_escape 的別名
json_encode: tornado.escape.json_encode 的別名
squeeze: tornado.escape.squeeze 的別名
linkify: tornado.escape.linkify 的別名
datetime: Python 的 datetime 模组
handler: 当前的 RequestHandler 对象
request: handler.request 的別名
current_user: handler.current_user 的別名
locale: handler.locale 的別名
_: handler.locale.translate 的別名
static_url: for handler.static_url 的別名
xsrf_form_html: handler.xsrf_form_html 的別名
当然了,还可以自定义自己的功能
4.自定义UIMethod以UIModule
UIMethod:方便小巧,适合简单的方法
# uimethods.py def tab(self):
return 'UIMethod'
------------------------------
导入和注册
import uimethods as mt settings = {
......,
'ui_methods': mt,
}
------------------------------
使用就很方便了
{{ tab() }} #记住要加()
UIModule:模块化,适合组合模块
from tornado.web import UIModule
from tornado import escape class custom(UIModule): def render(self, *args, **kwargs):
'''直接返回内容''' def css_files(self):
'''返回一个引入式css路径''' def embedded_css(self):
'''以字符串的方式返回一个嵌入式的css''' def javascript_files(self):
'''返回一个引入式JS路径''' def embedded_javascript(self):
'''以字符串的方式返回css语句''' ------------------------------
导入和注册
import uimodules as md settings = {
......,
'ui_modules': md,
}
------------------------------
使用
{% module custom(123) %} # 可以传参
5.静态文件
对于静态文件,可以配置静态文件的目录和前段使用时的前缀,并且Tornaodo还支持静态文件缓存。
在设置中写上:
settings = {
'template_path': 'template',
'''模版路径'''
'static_path': 'static',
'''实际静态文件路径'''
'static_url_prefix': '/static/',
'''静态文件的默认识别前缀,意思是静态文件的路径不管是什么,这要这里写了/static/,
前端不管真实路径,直接用/static/,tornado会自动查找真实路径'''
}
--------------------------------------------
前端使用
<link href="/static/example.css" rel="stylesheet" />
为避免出现前缀修改后前端全部都要修改的情况,还可以用一个方法,使前端可以自动生成路径的前缀
<link href="{{ static_url("example.css") }}" rel="stylesheet" />
6.Cookie
Tornado中可以对cookie进行操作,并且还可以对cookie进行签名以放置伪造。
self.set_cookie("mycookie", "myvalue")
'''设置cookie'''
self.set_secure_cookie("mycookie", "myvalue")
'''设置加密cookie'''
设置cookie的时候可以加时间戳参数expires=...,意为到这个时间cookie失效
或者expires_day=3,则过期时间是3天,同时设置的话expires优先级更高
注意:设置加密cookie的时候,需在setting中设置加密签名
settings = {
......,
'cookie_secret':'自己填',
}
--------------------------------------------
self.get_cookie('mycookie')
'''获取cookie'''
self.get_secure_cookie('mycookie')
'''获取加密cookie'''
签名Cookie的本质是:
写cookie过程:
将值进行base64加密
对除值以外的内容进行签名,哈希算法(无法逆向解析)
拼接 签名 + 加密值
读cookie过程:
读取 签名 + 加密值
对签名进行验证
base64解密,获取值内容
7.XSRF
Tornado中的跨站请求伪造和Django中的相似.
设置:
settings = {
...
"xsrf_cookies": True,
}
使用:
<form action="/new_message" method="post">
{{ xsrf_form_html() }}
<input type="text"/>
</form>
Ajax使用就在本地获取cookie,携带cookie发送请求
_xsrf = getCookie("_xsrf")
8.异步非阻塞
装饰器 + Future 从而实现Tornado的异步非阻塞
class AsyncHandler(tornado.web.RequestHandler):
@gen.coroutine
def get(self):
future = Future()
future.add_done_callback(self.doing)
yield future
# 或
# tornado.ioloop.IOLoop.current().add_future(future,self.doing)
# yield future
def doing(self,*args, **kwargs):
self.write('async')
self.finish()
当发送GET请求时,由于方法被@gen.coroutine装饰且yield 一个 Future对象,那么Tornado会等待,等待用户向future对象中放置数据或者发送信号,如果获取到数据或信号之后,就开始执行doing方法。
异步非阻塞体现在当在Tornaod等待用户向future对象中放置数据时,还可以处理其他请求。
注意:在等待用户向future对象中放置数据或信号时,此连接是不断开的。
其他
tornado中的请求的一切都可以在self.request中找到.
待定
Tornado 框架的使用的更多相关文章
- python tornado框架实现CRUD
1.本例采用postgresql数据库,创建数据表 user_tbl ),signup_date date); 2.webapi接口 (1)tornado框架配置 t_tornado.py #-*- ...
- python运维开发(二十三)---tornado框架
内容目录: 路由系统 模板引擎 cookie 加密cookie 自定义api 自定义session 自定义form表单验证 异步非阻塞 web聊天室实例 路由系统 路由系统其实就是 url 和 类 的 ...
- python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介
内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...
- Tornado框架简介
-------------------简介------------------- 1.概念: Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器 ...
- tornado框架源码分析---Application类之debug参数
先贴上Application这个类的源码. class Application(httputil.HTTPServerConnectionDelegate): """A ...
- Tornado框架配置使用Jinja2模板引擎
安装jinja2包 pip install jinja2 定义继承tornado.web.RequestHandler的子类BaseHandler.如果请求处理类继承这个类将会使用jinja模板引擎: ...
- tornado框架学习及借用有道翻译api做自动翻译页面
趁着这几天有时间,就简单的学了一下tornado框架,简单做了个自动翻译的页面 仅为自己学习参考,不作其他用途 文件夹目录结构如下: . ├── server.py ├── static │ └─ ...
- tornado框架&三层架构&MVC&MTV&模板语言&cookie&session
web框架的本质其实就是socket服务端再加上业务逻辑处理, 比如像是Tornado这样的框架. 有一些框架则只包含业务逻辑处理, 例如Django, bottle, flask这些框架, 它们的使 ...
- 03: 自定义异步非阻塞tornado框架
目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 源码 1 ...
- tornado框架的get方法传递参数
tornado框架的get方法传递参数,代码: # encoding: utf-8 """ @version: ?? @author: andu99 @contact: ...
随机推荐
- select * from v$reserved_words
select * from v$reserved_words 查询库中所有关键字
- jquery日期和时间的插件精确到秒
首先.html5提供了input的time类型,使我们可以通过input框输入日期,但是如果我们的需求是这个时间需要明确到几时几分几秒的,那html5就没有办法满足我们的需求了,就需要使用jQuery ...
- ping命令技巧详解 windows下ping命令知识大全
windows ping命令对于多数电脑爱好者都不会陌生,通过ping ip可以知道网络是否畅通或者网络传输质量如何等,是网络技术人员常用的检测网络命令,多数朋友对ping命令知道的并不多,接下来本文 ...
- iOS-----使用CFNetwork实现TCP协议的通信
使用CFNetwork实现TCP协议的通信 TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个通信接口,从而在通信的两端之间形成网络虚拟链路.一旦建立了虚拟的网络链路,两端的程序就可以 ...
- Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)
我在之前的博客中有教大家如何编写 NuGet 工具包,其中就有编写 .targets 文件. 我在实际的使用中,发现 Visual Studio 2017 带来的含 Sdk 的新 csproj 格式基 ...
- 10款PHP开源网店系统
在当今经济危机的大环境下,网上购物越来越来吃香,网上开店成本低,快捷方便,出名的电子商务网站有淘宝,拍拍,Ebay或是最新的百度有啊,这些网站都提供开店的机会,如果是想自己搭建购物平台,可以从下面选择 ...
- hdu1355
题意:有一片矩形花生田在路的一侧,田上的整数坐标位置有0个或多个花生,现规定从路上走到田地最边上的某个格点位置.从田边上走回路上.从一个格点移动到另一个格点.采摘格点上的花生,这四种动作都要花费一单位 ...
- com.fasterxml.jackson.databind.ObjectMapper. .readValue .convertValue
String str="{\"student\":[{\"name\":\"leilei\",\"age\": ...
- ballerina 学习 三十二 编写安全的程序
ballerina编译器已经集成了部分安全检测,在编译时可以帮助我们生成错误提示,同时ballerina 标准库 已经对于常见漏洞高发的地方做了很好的处理,当我们编写了有安全隐患的代码,编译器就已 ...
- log4net保存到数据库系列二:独立配置文件中配置log4net
园子里面有很多关于log4net保存到数据库的帖子,但是要动手操作还是比较不易,从头开始学习log4net数据库日志一.WebConfig中配置log4net 一.WebConfig中配置log4ne ...