安装jinja2包

  1. pip install jinja2

定义继承tornado.web.RequestHandler的子类BaseHandler。如果请求处理类继承这个类将会使用jinja模板引擎;如果请求处理类继承tornado.web.RequestHandler,则会使用Tornado框架的模板引擎。

  1. import os
  2.  
  3. from jinja2 import Environment, FileSystemLoader, TemplateNotFound
  4. from tornado.web import RequestHandler, Application
  5. from tornado.httpserver import HTTPServer
  6. from tornado.ioloop import IOLoop
  7.  
  8. class TemplateRendering(object):
  9. """
  10. A simple class to hold methods for rendering templates.
  11. """
  12. def render_html_file(self, template_name, **kwargs):
  13. template_dirs = []
  14. if self.settings.get('template_path', ''):
  15. template_dirs.append(self.settings['template_path'])
  16. env = Environment(loader=FileSystemLoader(template_dirs))
  17. try:
  18. template = env.get_template(template_name)
  19. except TemplateNotFound:
  20. raise TemplateNotFound(template_name)
  21. content = template.render(kwargs)
  22. return content
  23.  
  24. class BaseHandler(RequestHandler, TemplateRendering):
  25.  
  26. def initialize(self):
  27. pass
  28.  
  29. def get_current_user(self):
  30. user = self.get_secure_cookie("user")
  31. return user or None
  32.  
  33. def render_template(self, template_name, **kwargs):
  34. kwargs.update({
  35. "settings": self.settings,
  36. "STATIC_URL": self.settings.get("static_url_prefix", "/static/"),
  37. "request": self.request,
  38. "current_user": self.current_user,
  39. "xsrf_token": self.xsrf_token,
  40. "xsrf_form_html": self.xsrf_form_html
  41. })
  42. content = self.render_html_file(template_name, **kwargs)
  43. self.finish(content)
  44.  
  45. class NewHandler(BaseHandler):
  46.  
  47. def get(self, *args, **kwargs):
  48. self.render_template("new.html", text="")
  49.  
  50. def post(self, *args, **kwargs):
  51. text = self.get_argument("text", "")
  52. print(text)
  53. self.set_header("X-XSS-Protection", 0)
  54. self.render_template("new.html", text=text)
  55.  
  56. class OldHandler(RequestHandler):
  57.  
  58. def get(self, *args, **kwargs):
  59. self.render("old.html", text="")
  60.  
  61. def post(self, *args, **kwargs):
  62. text = self.get_argument("text", "")
  63. print(text)
  64. self.set_header("X-XSS-Protection", 0)
  65. self.render("old.html", text=text)
  66.  
  67. if __name__ == '__main__':
  68. current_path = os.path.dirname(__file__)
  69. app = Application([
  70. (r"/new", NewHandler),
  71. (r"/old", OldHandler)
  72. ],
  73. cookie_secret="HelloWorld",
  74. static_path=os.path.join(current_path, "static"),
  75. template_path=os.path.join(current_path, "templates")
  76. )
  77. http_server = HTTPServer(app)
  78. http_server.bind(8080)
  79. http_server.start()
  80. IOLoop.current().start()

HTML代码如下

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>escape</title>
  6. </head>
  7. <body>
  8. <form method="post">
  9. <textarea name="text" id="js" cols="30" rows="10"></textarea>
  10. <input type="submit" value="提交">
  11. </form>
  12. {{ text|escape}} <!-- 开启转义 -->
  13. {{ text }} <!-- 关闭转义,js代码将会执行 -->
  14. </body>
  15. </html>

new.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>escape</title>
  6. </head>
  7. <body>
  8. <form method="post">
  9. <textarea name="text" id="js" cols="30" rows="10"></textarea>
  10. <input type="submit" value="提交">
  11. </form>
  12. {{ text }} <!-- Tornado模板自动开启转义 -->
  13. {% raw text %} <!-- 使用模板语法{% raw *text* %}, JS代码将执行 -->
  14. </body>
  15. </html>

old.html

注意:在Firefox浏览器中会直接弹出alert窗口,而在Chrome浏览器中,需要set_header("X-XSS-Protection", 0)

Tornado还有两种方法关闭自动转义:

  1. 在Application构造函数中传递autoescape=None参数;
  2. 在每页模板中修改自动转义行为,添加语句:{% autoescape None %}

Tornado框架配置使用Jinja2模板引擎的更多相关文章

  1. flask框架下的jinja2模板引擎(2)(过滤器与自定义过滤器)

    flask框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html 这篇论文主要用来记录下 jinja2 的过滤器. 什么是过 ...

  2. flask框架下的jinja2模板引擎(3)(模板继承与可以在模板使用的变量、方法)

    flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html flask 框架下的jinja2模块引擎(2):http ...

  3. flask框架下的jinja2模板引擎(1)(模板渲染)

    #转载请留言联系 模板是什么? 在 flask 框架中,视图函数有两个作用:处理业务逻辑和返回响应内容.在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本.模板作用即是承担视图函 ...

  4. Flask 框架下 Jinja2 模板引擎高层 API 类——Environment

    Environment 类版本: 本文所描述的 Environment 类对应于 Jinja2-2.7 版本.   Environment 类功能: Environment 是 Jinja2 中的一个 ...

  5. 【Python-Django】Jinja2模板引擎配置教程详解!!!!

    Jinjia2的官方文档:http://jinja.pocoo.org/docs/2.10/ 1. 安装Jinja2扩展包 $ pip install Jinja2 2. 配置Jinja2模板引擎 T ...

  6. 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范

    一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...

  7. 使用jinja2模板引擎生成html文件

    使用jinja2模板引擎生成html文件 jinja2是纯Python的模板引擎,是仿照Django模板的Python模板语言. 它速度快,被广泛使用,提供了可选的沙箱模板执行环境保证安全. 使用pi ...

  8. ThinkPHP框架配置自定义的模板变量(十)

    原文:ThinkPHP框架配置自定义的模板变量(十) 模板替换(手册有详细介绍对应的目录) __PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/ __ROOT__: 会替换成当 ...

  9. Flask从入门到精通之Jinja2模板引擎

    我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: <h1>Hello World!</h1> 最简单的包 ...

随机推荐

  1. Vue --- :is

    1.1 基本示例 <div id="app"> <!-- template slot transition --> <input type=" ...

  2. [随笔][Java][修改pom仓库库为阿里云]

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  3. 【C#】stream图像转byte的问题

    Image xx = Image.FromStream(linkList[ii].stream); byte[] bytes = new Byte[linkList[ii].stream.Length ...

  4. js中使用showModelDialog中下载文件的时候,闪一下后无法下载

    在js中使用showModelDialog中下载文件的时候,会因为showModelDialog自动设置target为_self导致下载文件“只会闪一下”就消失掉 在吧target设置为_blank后 ...

  5. 闲话Pipeline In Maya

    在整个行业都在高呼“农业学大寨,流程学xx”的大背景下,你想推出一个新的更好的流程有着极大的难度. 在2014年的时候行业内大部分公司就有了资产的概念,会成立资产部门去专门创建资产,供后续环节多次重用 ...

  6. java Servlet生成随机验证码

    import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; i ...

  7. nginx的autoindex,目录浏览,配置和美化,美观的xslt_stylesheet

    nginx的autoindex,目录浏览,配置和美化,美观的xslt_stylesheet Nginx custom autoindex with XSLT 转载注明来源: 本文链接 来自osnosn ...

  8. python中的函数参数的传递

    转载自: http://winterttr.me/2015/10/24/python-passing-arguments-as-value-or-reference/ 我想,这个标题或许是很多初学者的 ...

  9. 大数据学习之路(1)Hadoop生态体系结构

    Hadoop的核心是HDFS和MapReduce,hadoop2.0还包括YARN. Hadoop1.x的生态系统: Hadoop2.x引入YARN: HDFS(Hadoop分布式文件系统)源自于Go ...

  10. 二叉搜索树(BST)学习笔记

    BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...