一. 在 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. Redis(一)基础

    Redis Remote Dictionary Server 远程字典服务器 功能 缓存(当空间达到限制时,可以按照一定规则,淘汰部分数据) 队列(支持阻塞式读取) 订阅/发布(可以将其做出聊天室) ...

  2. Java实现文件压缩与解压

    Java实现ZIP的解压与压缩功能基本都是使用了Java的多肽和递归技术,可以对单个文件和任意级联文件夹进行压缩和解压,对于一些初学者来说是个很不错的实例.(转载自http://www.puiedu. ...

  3. Unity使用Windows弹窗保存图片

    此功能都在类EditorUtility中(using UnityEditor;) 包括 OpenFilePanel打开文件窗口Displays the "open file" di ...

  4. Button四角有弧度及按下显示不同的颜色

    一般的button都是矩形或者正方形,但为了显示不同的效果,让界面更美化,可以对其进行处理!!! 1.四角有弧度的button 2.按下button显示不同的颜色 实现步骤: 首先在drawable文 ...

  5. C# Using 用法

    using 语句允许程序员指定使用资源的对象应当何时释放资源.为 using 语句提供的对象必须实现 IDisposable 接口.此接口提供了 Dispose 方法,该方法将释放此对象的资源. 一起 ...

  6. RedHat 6.7 Enterprise x64环境下使用RHCS部署Oracle 11g R2双机双实例HA

     环境 软硬件环境 硬件环境: 浪潮英信服务器NF570M3两台,华为OceanStor 18500存储一台,以太网交换机两台,光纤交换机两台. 软件环境: 操作系统:Redhat Enterpris ...

  7. Java重点之小白解析--浅谈HashMap与HashTable

    这是一个面试经常遇到的知识点,无论什么公司这个知识点几乎是考小白必备,为什么呢?因为这玩意儿太特么常见了,常见到你写一百行代码,都能用到好几次,不问这个问哪个.so!本小白网罗天下HashMap与Ha ...

  8. 开发Protege插件时,出现打开Protege后并不显示插件的原因

    最近跟着导师一起开发了一个Protege插件,在按照http://www.cnblogs.com/biaoyu/archive/2011/01/07/1929715.html中所述一步步进行到最后时, ...

  9. Unity 之 Shader 对Z深度的偏移

    对Z深度的偏移 Offset 指令给了我们一个操作正常的ZTest 检测结果的手段. Offset有两个参数,这两个参数理解起来不是很直观,而且具体实现是和硬件相关的 下面在实际例子中看他的效果 Sh ...

  10. SQL Server Management Studio 2012 设置脚本默认保存路径

    特别说明,本文是从这里 修改SQL Server Management Studio默认设置提高开发效率. "抄过来的",为方便个人记忆才写此文(非常感谢这哥们儿的分享.) 原文地 ...