Tornado框架配置使用Jinja2模板引擎
安装jinja2包
- pip install jinja2
定义继承tornado.web.RequestHandler的子类BaseHandler。如果请求处理类继承这个类将会使用jinja模板引擎;如果请求处理类继承tornado.web.RequestHandler,则会使用Tornado框架的模板引擎。
- import os
- from jinja2 import Environment, FileSystemLoader, TemplateNotFound
- from tornado.web import RequestHandler, Application
- from tornado.httpserver import HTTPServer
- from tornado.ioloop import IOLoop
- class TemplateRendering(object):
- """
- A simple class to hold methods for rendering templates.
- """
- def render_html_file(self, template_name, **kwargs):
- template_dirs = []
- if self.settings.get('template_path', ''):
- template_dirs.append(self.settings['template_path'])
- env = Environment(loader=FileSystemLoader(template_dirs))
- try:
- template = env.get_template(template_name)
- except TemplateNotFound:
- raise TemplateNotFound(template_name)
- content = template.render(kwargs)
- return content
- class BaseHandler(RequestHandler, TemplateRendering):
- def initialize(self):
- pass
- def get_current_user(self):
- user = self.get_secure_cookie("user")
- return user or None
- def render_template(self, template_name, **kwargs):
- kwargs.update({
- "settings": self.settings,
- "STATIC_URL": self.settings.get("static_url_prefix", "/static/"),
- "request": self.request,
- "current_user": self.current_user,
- "xsrf_token": self.xsrf_token,
- "xsrf_form_html": self.xsrf_form_html
- })
- content = self.render_html_file(template_name, **kwargs)
- self.finish(content)
- class NewHandler(BaseHandler):
- def get(self, *args, **kwargs):
- self.render_template("new.html", text="")
- def post(self, *args, **kwargs):
- text = self.get_argument("text", "")
- print(text)
- self.set_header("X-XSS-Protection", 0)
- self.render_template("new.html", text=text)
- class OldHandler(RequestHandler):
- def get(self, *args, **kwargs):
- self.render("old.html", text="")
- def post(self, *args, **kwargs):
- text = self.get_argument("text", "")
- print(text)
- self.set_header("X-XSS-Protection", 0)
- self.render("old.html", text=text)
- if __name__ == '__main__':
- current_path = os.path.dirname(__file__)
- app = Application([
- (r"/new", NewHandler),
- (r"/old", OldHandler)
- ],
- cookie_secret="HelloWorld",
- static_path=os.path.join(current_path, "static"),
- template_path=os.path.join(current_path, "templates")
- )
- http_server = HTTPServer(app)
- http_server.bind(8080)
- http_server.start()
- IOLoop.current().start()
HTML代码如下
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>escape</title>
- </head>
- <body>
- <form method="post">
- <textarea name="text" id="js" cols="30" rows="10"></textarea>
- <input type="submit" value="提交">
- </form>
- {{ text|escape}} <!-- 开启转义 -->
- {{ text }} <!-- 关闭转义,js代码将会执行 -->
- </body>
- </html>
new.html
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>escape</title>
- </head>
- <body>
- <form method="post">
- <textarea name="text" id="js" cols="30" rows="10"></textarea>
- <input type="submit" value="提交">
- </form>
- {{ text }} <!-- Tornado模板自动开启转义 -->
- {% raw text %} <!-- 使用模板语法{% raw *text* %}, JS代码将执行 -->
- </body>
- </html>
old.html
注意:在Firefox浏览器中会直接弹出alert窗口,而在Chrome浏览器中,需要set_header("X-XSS-Protection", 0)
Tornado还有两种方法关闭自动转义:
- 在Application构造函数中传递autoescape=None参数;
- 在每页模板中修改自动转义行为,添加语句:{% autoescape None %}
Tornado框架配置使用Jinja2模板引擎的更多相关文章
- flask框架下的jinja2模板引擎(2)(过滤器与自定义过滤器)
flask框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html 这篇论文主要用来记录下 jinja2 的过滤器. 什么是过 ...
- flask框架下的jinja2模板引擎(3)(模板继承与可以在模板使用的变量、方法)
flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html flask 框架下的jinja2模块引擎(2):http ...
- flask框架下的jinja2模板引擎(1)(模板渲染)
#转载请留言联系 模板是什么? 在 flask 框架中,视图函数有两个作用:处理业务逻辑和返回响应内容.在大型应用中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本.模板作用即是承担视图函 ...
- Flask 框架下 Jinja2 模板引擎高层 API 类——Environment
Environment 类版本: 本文所描述的 Environment 类对应于 Jinja2-2.7 版本. Environment 类功能: Environment 是 Jinja2 中的一个 ...
- 【Python-Django】Jinja2模板引擎配置教程详解!!!!
Jinjia2的官方文档:http://jinja.pocoo.org/docs/2.10/ 1. 安装Jinja2扩展包 $ pip install Jinja2 2. 配置Jinja2模板引擎 T ...
- 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范
一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...
- 使用jinja2模板引擎生成html文件
使用jinja2模板引擎生成html文件 jinja2是纯Python的模板引擎,是仿照Django模板的Python模板语言. 它速度快,被广泛使用,提供了可选的沙箱模板执行环境保证安全. 使用pi ...
- ThinkPHP框架配置自定义的模板变量(十)
原文:ThinkPHP框架配置自定义的模板变量(十) 模板替换(手册有详细介绍对应的目录) __PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/ __ROOT__: 会替换成当 ...
- Flask从入门到精通之Jinja2模板引擎
我们使用一个简单的例子切入到Jinja2模板引擎,形式最简单的Jinja2模板引擎就是一个包含响应文本的文件,实例如下: <h1>Hello World!</h1> 最简单的包 ...
随机推荐
- Vue --- :is
1.1 基本示例 <div id="app"> <!-- template slot transition --> <input type=" ...
- [随笔][Java][修改pom仓库库为阿里云]
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 【C#】stream图像转byte的问题
Image xx = Image.FromStream(linkList[ii].stream); byte[] bytes = new Byte[linkList[ii].stream.Length ...
- js中使用showModelDialog中下载文件的时候,闪一下后无法下载
在js中使用showModelDialog中下载文件的时候,会因为showModelDialog自动设置target为_self导致下载文件“只会闪一下”就消失掉 在吧target设置为_blank后 ...
- 闲话Pipeline In Maya
在整个行业都在高呼“农业学大寨,流程学xx”的大背景下,你想推出一个新的更好的流程有着极大的难度. 在2014年的时候行业内大部分公司就有了资产的概念,会成立资产部门去专门创建资产,供后续环节多次重用 ...
- java Servlet生成随机验证码
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; i ...
- nginx的autoindex,目录浏览,配置和美化,美观的xslt_stylesheet
nginx的autoindex,目录浏览,配置和美化,美观的xslt_stylesheet Nginx custom autoindex with XSLT 转载注明来源: 本文链接 来自osnosn ...
- python中的函数参数的传递
转载自: http://winterttr.me/2015/10/24/python-passing-arguments-as-value-or-reference/ 我想,这个标题或许是很多初学者的 ...
- 大数据学习之路(1)Hadoop生态体系结构
Hadoop的核心是HDFS和MapReduce,hadoop2.0还包括YARN. Hadoop1.x的生态系统: Hadoop2.x引入YARN: HDFS(Hadoop分布式文件系统)源自于Go ...
- 二叉搜索树(BST)学习笔记
BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...