小记初试tornado与ajax,一些注意点
一. 在 tornado模板中使用自定义方法
在tornado中可以使用两种方式,达到在模板中调用自定义方法的效果,第一种是使用UIMethod 和UIModule。
1.UIMethod使用方法示例如下:
(1)在项目中建立一个新py文件命名为uimethod:

需要注意的是,这里的函数都需要加一个参数self,否则会报错
def show(self):
return "" def lower_case(self, arg):
return arg.lower()
原因是这里的函数,其实本质上是渲染模板的handler类的方法,如下图中debug时候跟踪的结果所示,self其实就是MainHandler的实例

(2)在程序入口文件中引入并注册settings(key为ui_methods):
import uimethods as mt
# 其他的部分略...
settings = {
'template_path': 'template',
'static_path': 'static',
'static_url_prefix': '/static/',
'ui_methods': mt,
}
(3)在模板中使用方法:

注意这里调用lower_case处的入参test,是必须在render模板的时候,传入方法的,否则就是未定义,和其他直接在模板里使用的变量相同:
class MainHandler(tornado.web.RequestHandler):
@asynchronous
@gen.coroutine
def get(self):
is_authed = (self.get_cookie('auth', None) == USER)
self.render('index.html', is_authed=is_authed, user_id=self.get_cookie('auth', None), contents=CONTENTS, test='AA')
2. UIModule使用方法示例如下:
(1)创建文件

UIModule就是自定义类继承UIModule,其方法render返回的内容在模板上调用类的时候会被显示
from tornado.web import UIModule
from tornado import escape class showMod(UIModule): def render(self, *args, **kwargs):
return escape.xhtml_escape('')
(2)在程序入口文件中引入并注册settings(key为ui_mothods):
import uimethods as mt
settings = {
'template_path': 'template',
'static_path': 'static',
'static_url_prefix': '/static/',
'ui_methods': mt,
'ui_modules': md,
}
(3)在模板中使用:

3. 然后小记一点tornado模板实现的原理:


实际上就是把模板的html,先根据{{与{%等特殊字符分割,将这些特殊部分外的字符串与特殊字符内的内容进行拼接;特殊字符内的字符串会经过一些特殊处理,比如获取变量判断类型,做python的逻辑判断或者是循环或者是函数调用等等,然后这些运算结果与其他部分进行拼接。拼接的方式是生成如左图这样一个函数的字符串,该函数作用是将内容根据我之前说的步骤,append到_buffer的列表里。然后把这个字符串用compile和exec即可编译执行。
对于函数中的参数如"title","data",是将render方法里面传入的参数,作为namespace全局变量加入exec里面,这样来实现的,简单的模拟如下:

4. tornado当中还提供了一写内置模板方法(其实也是用UIMothod,UIModule)实现的,小计如下:
- 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 的別名
二. static_path 和 static_url_prefix配置
在tornado的settings当中,有两个非必选参数 static_path和static_url_prefix,用来简化关于静态文件获取的方法。使用实例如下:

1. static_path 默认值为 static,也就是配置的所有静态文件的根目录,然后在模板或css中寻找文件路径的时候,就不用都自己去做一写绝对路径的配置写法了,方便统一管理修改,tornado就回到这里去找静态文件。只需要在模板中使用方法static_url,就会自动生成访问静态文件的相对路径,使用示例如下:

结果转换出来的是:

可以看到自动在css前面加了static,后面的v=XXXXXXXX则是static_url的另外个功能即让浏览器生成缓存记录
2.static_url_prefix 默认值为 /static/, 配置的是模板方法 static_url 里生成的结果里面 ,比如上面那个例子里面,就是/static/css前面的这个static,是可以改掉的,url就会不同。不过改这个不影响去找静态文件的存储路径也就是static_path
三. tornado中对cookie的一些操作
1. tornado中设置cookie示例:
self.set_cookie('auth', user_id, expires_days=30)
前两个分别是cookie键和值,后面的expires_days是可选参数,设置过期时间。如果我们想操作用户登出以后的cookie失效,可以改成expires_days=0。此外set_cookie还有个重要的可选参数是path,可以指定路径,这个cookie就会只能在指定的路径(路由页面)生效。
2. 获取cookie示例:
self.get_cookie('auth', None)
3. 给cookie加盐示例:
tornado中的set_cookie和get_cookie是明文不加密传输的,set_secure_cookie和get_secure_cookie是明文加密传输的,使用后两者的方法与前两者相同,只是需要在settings里面多加一点,在tornado.web.Application中设置cookie_secret参数:

也就是为其加盐!此外如果我们看一下set_secure_cookie的源码,会发现其expires_days默认值为30,而set_cookie的默认值为None...也就是注意用了set_secure_cookie以后默认就会持续30天的,而且还发现set_secure_cookie当中并没有path这个可选参数哦。
4. 此外RequestHandler 的cookies(示例用self.cookies)属性是获得所有cookie。
四. 对ajax发送的数据中含有中文的处理
在尝试使用ajax向tornado后端发post请求时候,我发现发送的data里面带有非拉丁字符的话,tornado在获取是会产生错误,无法正确地用get_argument取到参数

这个时候可以使用js的“encodeURI”方法来进行编码,示例如下:
var params = "article=" + encodeURI(text) + "&group=" + encodeURI(group);
这样在py3的tornado中使用get_argument时候就能正确获取了,而且也不用特意再decode。
小记初试tornado与ajax,一些注意点的更多相关文章
- 使用Tornado实现Ajax请求
Ajax,指的是网页异步刷新,一般的实现均为js代码向server发POST请求,然后将收到的结果返回在页面上. 这里我编写一个简单的页面,ajax.html <html> <h ...
- tornado接收ajax的post请求报错WARNING:tornado.access:405 OPTIONS /add
后端报错信息 WARNING:tornado.access:405 OPTIONS /add (::1) 1.00m 前端报错信息 2xhr.js?ec6c:172 OPTIONS http://lo ...
- php中ajax跨域请求---小记
php中ajax跨域请求---小记 前端时间,遇到的一个问题,情况大约是这样: 原来的写法: 前端js文件中: $.ajax({ type:'get', url:'http://wan.xxx.c ...
- tornado框架之路三之ajax
一.ajax 1.传统的Web应用 一个简单操作需要重新加载全局数据 2.AJAX AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是 ...
- tornado之文件上传的几种形式form,伪ajax(iframe)
1直接form提交给后台处理 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- 第二百七十二节,Tornado框架-iframe标签框架伪造ajax
Tornado框架-iframe标签框架伪造ajax html <!DOCTYPE html> <html> <head lang="en"> ...
- Tornado小记 -- 模板中的Handler
在Tornado的前端页面模板中,Tornado提供了一些对象别名来快速访问对象,具体定义可以参考Tornado官方文档! 这里我想将的是Handler这个对象,Handler指向的处理当前这个页面的 ...
- 关于Ajax的认识和封装(小记)
一,Ajax 的概念 1,Ajax 是一种在无需重新加载整个网页(即刷新网页)的情况下,能够更新部分网页的技术. 2,Ajax 的全称是Asynchronous Javascript And XML” ...
- 一次ajax请求导致status为canceled的原因小记
偶然碰到一个小Bug ajax请求执行后返回了一个canceled(状态码) 但是后台却接受了参数并且执行成功0.0 刚看到这个状态的时候是一脸懵逼的.... 之前并没见过这样的状态码 经过参数确认并 ...
随机推荐
- win7 双屏双任务栏
扩展屏幕下都显示任务栏!!! 第一步:Dual Monitor Taskbar 下载 下载链接:链接: http://pan.baidu.com/s/1pKxYUFL 密码: gu5c 第二步:安装完 ...
- jquery each循环,
jquery each循环,要实现break和continue的功能: break----用return false; continue --用return ture; each()函数是基本上所有的 ...
- Brophp框架开发时连接数据库读取UTF8乱码的解决(转)
Brophp框架开发时连接数据库读取UTF8乱码的解决办法 (2012-09-15 10:41:22) 转载▼ 标签: 杂谈 it php 分类: 建站技术 Brophp框架开发时连接数据库读取UTF ...
- 显示天气预报的Demo
实现的效果如下所示: 代码如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewCo ...
- 全基因组关联分析(Genome-Wide Association Study,GWAS)流程
全基因组关联分析流程: 一.准备plink文件 1.准备PED文件 PED文件有六列,六列内容如下: Family ID Individual ID Paternal ID Maternal ID S ...
- Oracle数据库自动启动Shell脚本
为了保证Oracle在下次系统重启后,能自动启动服务,这里我们可以通过一个Shell脚步来实现这个功能.假定脚步名称为/app/oracle/oraclestart.sh,其内容如下: #!/bi ...
- 16.10.18学到的Java知识
1. 突然间发现自己忘了关于自增自减运算符放在变量前后的区别是什么了? 于是乎,我查了资料. 如果只对自变量进行加1或减1的时候,放在前面和后面都是没有区别的. 但是,如果自增自减运算符使用在需要赋值 ...
- object.bind()方法的低版本兼容
Function.prototype.bind= function(obj){ var _self = this, args = arguments; return function() { _sel ...
- Oracle如何导入导出数据(转自)
导出:exp ssht/taxware@sshtfile=d:\ssht.dmpexp 用户名/密码@服务名导入:imp ssht/taxware@mysshtfile=d:\ssht.dmp fro ...
- Robot Framework入门学习1 安装部署详解
安装注意: 目前Robot framework-ride不支持python3,安装时请下载python2.7版本. Robot Framework安装时出现了一点小问题,网上没有找到直接的介绍,现将安 ...