一. 在 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. JavaScript prototype 使用介绍

    用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了, ...

  2. Python第一模块

    一.Python简介 二.Python种类 三.Python环境  windows: 1.需要配置环境变量 2.更新:卸载重装 linux:1.常用命令: 查看默认Python版本 Python -V ...

  3. [字符编码]Invalid byte 1 of 1-byte UTF-8 sequence终极解决方案

    今天在eclipse中编写pom.xml文件时,注释中的中文被eclipse识别到错误:Invalid byte 1 of 1-byte UTF-8 sequence,曾多次遇到该问题,问题的根源是: ...

  4. nosql数据库学习

    1.MongoDB 介绍 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.主要解决的是海量数据的访问效率问题,为WEB应用提供可扩展的高性能数据存储解决方案.当数据量达到50GB以上 ...

  5. exception 'yii\base\ErrorException' with message 'Class 'MongoClient' not found'

    问题描述: 本来项目运行的好好的,搬了一次办公室(电脑主机一起搬的),第二天的时候就登录不了了. php版本和扩展没有改变,且没有修改任何配置,我尝试重启php5-fpm 服务,又重启nginx服务, ...

  6. greendao操作数据库的使用方法

    第一步:把greendao-1.3.0-beta-1,greendao-generator-1.3.1两个jar包加载到工程的lib的文件夹中,一定要右键点击Add As Library后才能使用. ...

  7. atoi()函数

    原型:int  atoi (const  char  *nptr) 用法:#include  <stdlib.h> 功能:将字符串转换成整型数:atoi()会扫描参数nptr字符串,跳过前 ...

  8. 30分钟groovy快速入门并掌握(ubuntu 14.04+IntelliJ 13)

    本文适合于不熟悉 Groovy,但想快速轻松地了解其基础知识的 Java开发人员.了解 Groovy 对 Java 语法的简化变形,学习 Groovy 的核心功能,例如本地集合.内置正则表达式和闭包. ...

  9. python学习之——splinter介绍

    Splinter是什么: 是一个用 Python 编写的 Web 应用程序进行验收测试的工具. Splinter执行的时候会自动打开你指定的浏览器,访问指定的URL,然后你所开发的模拟的任何行为,都会 ...

  10. SVN和CVS的区别

    对版本控制就有了一定的理解,同时也应该知道SVN与CVS是比较流行的两款SCM工具.那么到底这两款工具有什么区别呢? 1.版本编号方面 例如,我们的版本库为A,其中有文件a,b,c. 在SVN中,新版 ...