安装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还有两种方法关闭自动转义:

  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. linux下软件安装的几种方式

    linux下软件安装的几种方式(主要有源码安装, rpm安装, yum安装). 一:源码安装 几乎所有的开源软件都支持在Linux下运行,而这些软件一般都以源码形式发放,只需要Linux安装了gcc. ...

  2. DOM 基础

    文档对象模型(Document Object Model)是表示和处理一个HTML或XML文档的常用方法 查找 直接查找 var obj = document.getElementById('i1') ...

  3. linux一些工具的安装(三)

    linux(vmware15   centos7)中Docker安装 一.Docker卸载 1.查看已安装的docker安装包 $yum list installed|grep docker 执行后的 ...

  4. LOJ 2551 「JSOI2018」列队——主席树+二分

    题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用 ...

  5. Btrace 拦截时机

    Kind.ENTRY 入口,默认值 Kind.RETURN:  返回 Kind.THROW: 异常 Kind.Line: 行 一.返回时拦截 package com.example.monitor_t ...

  6. 数据库if判断语句

    THEN '青年' ELSE '未成年' END) as age_text from user 更多写法参考:http://www.cnblogs.com/martinzhang/p/3220595. ...

  7. 二、易语言 api 相关

    1. 取窗口句柄    对应的api: FindWindow (寻找顶级窗口) 2.取窗口矩形(位置) 对应的api: GetWindowRect(取窗口矩形) 3.取窗口标题 对应的api: Get ...

  8. ionic3使用echarts

    1.安装typings及echarts npm install typings echarts --global 2.安装 ECharts 的 TypeScript 定义文件 npm install ...

  9. 【java】之位运算^,&,<<,>>,<<<,>>>总结

    1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算 ...

  10. word 添加文本框

    转https://blog.csdn.net/sroco/article/details/17044973 如何在word2013(2007.2010)中添加带滚动条的文本框 2013年11月30日 ...