一. 在 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,一些注意点的更多相关文章

  1. 使用Tornado实现Ajax请求

    Ajax,指的是网页异步刷新,一般的实现均为js代码向server发POST请求,然后将收到的结果返回在页面上.   这里我编写一个简单的页面,ajax.html <html> <h ...

  2. 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 ...

  3. php中ajax跨域请求---小记

    php中ajax跨域请求---小记   前端时间,遇到的一个问题,情况大约是这样: 原来的写法: 前端js文件中: $.ajax({ type:'get', url:'http://wan.xxx.c ...

  4. tornado框架之路三之ajax

    一.ajax 1.传统的Web应用 一个简单操作需要重新加载全局数据 2.AJAX AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是 ...

  5. tornado之文件上传的几种形式form,伪ajax(iframe)

    1直接form提交给后台处理 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  6. 第二百七十二节,Tornado框架-iframe标签框架伪造ajax

    Tornado框架-iframe标签框架伪造ajax html <!DOCTYPE html> <html> <head lang="en"> ...

  7. Tornado小记 -- 模板中的Handler

    在Tornado的前端页面模板中,Tornado提供了一些对象别名来快速访问对象,具体定义可以参考Tornado官方文档! 这里我想将的是Handler这个对象,Handler指向的处理当前这个页面的 ...

  8. 关于Ajax的认识和封装(小记)

    一,Ajax 的概念 1,Ajax 是一种在无需重新加载整个网页(即刷新网页)的情况下,能够更新部分网页的技术. 2,Ajax 的全称是Asynchronous Javascript And XML” ...

  9. 一次ajax请求导致status为canceled的原因小记

    偶然碰到一个小Bug ajax请求执行后返回了一个canceled(状态码) 但是后台却接受了参数并且执行成功0.0 刚看到这个状态的时候是一脸懵逼的.... 之前并没见过这样的状态码 经过参数确认并 ...

随机推荐

  1. 为什么C#中应该用Try-Catch?

    [为什么C#中应该用Try-Catch?] http://blog.csdn.net/dier4836/article/details/7292897

  2. Rust的几个预测

    写程序多年,语言也用过不下十种,对于Rust有种亲人的感觉,就像在梦中见到过似的.现在对于Rust特做出以下一些预测,希望Rust会有更大的影响力. 1. 当前的Rust的核心功能现以比较稳定,可以用 ...

  3. python 继承中的super

    python继承中子类访问父类的方法(包括__init__)主要有两种方法,一种是调用父类的未绑定方法,另一种是使用super(仅仅对于新式类),看下面的两个例子: #coding:utf-8 cla ...

  4. Hibernate报错:org.hibernate.ObjectNotFoundException: No row with the given identifier exists 解决办法

    报错信息: org.hibernate.event.internal.DefaultLoadEventListener onLoad INFO: HHH000327: Error performing ...

  5. for xml 字符串拼接

    SELECT TOP 10 B.user_gid,LEFT(StuList,LEN(StuList)-1) as hobby FROM (SELECT user_gid,( SELECT CAST(a ...

  6. UItextFiled只能输入数字

    - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementS ...

  7. final评论II

    1.  Nice  项目:约跑软件       在此次六个发布作品中,此作品是唯一基于Androrid开发app.并且此作品创意和实用性很高的,跑步是人们日渐热爱的一个活动,用户广泛,并且在网上沟通交 ...

  8. laravel之缓存配置文件

    清除之前配置文件缓存,并生成新的配置文件缓存, get bash: php artisan config:cache 如下图,以上命令会将config文件夹下所有的文件内容缓存到bootstrap/c ...

  9. 新的框架,新的感觉ASP.NET MVC 分享一个简单快速适合新手的框架

    在ASP.NET世界中摸爬滚打好几年,用过了各种框架,在最初的ASP.NET web from 到现在的MVC 在起初的经典三层,到现在的MVC  IOC  注入 . 突然发现,有些时候真不是跟风用一 ...

  10. Office组件之Spire.XLS的DotNet操作

    Overview 在项目中,我们经常需要将程序中获得的大量数据导出到Excel表格中,打印报表:进一步,还可能生成其折线图,对数据的变化趋势进行分析,从而更好地开展项目工作. 最近,我发现了一个对于D ...