Tornado框架配置使用Jinja2模板引擎

安装jinja2包

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

原文地址:https://www.cnblogs.com/Oliver-yzx/p/10348773.html

时间: 2024-10-09 06:09:14

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

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

原文:ThinkPHP框架配置自定义的模板变量(十) 模板替换(手册有详细介绍对应的目录) __PUBLIC__:会被替换成当前网站的公共目录 通常是 /Public/ __ROOT__: 会替换成当前网站的地址(不含域名) __APP__: 会替换成当前项目的URL地址 (不含域名) __GROUP__:会替换成当前分组的URL地址 (不含域名) __URL__: 会替换成当前模块的URL地址(不含域名) __ACTION__:会替换成当前操作的URL地址 (不含域名) __SELF__: 会

在Express中配置使用art-template模板引擎

先安装需要使用的包 cnpm install --save art-templatecnpm install --save express-art-template 配置(官网案例) var express = require('express') var express = require('express'); var app = express();//配置使用art-template模板引擎//第一个参数表示,当渲染以 .art 结尾时使用art-template模板引擎//expres

laravel框架总结(二) -- blade模板引擎

## 1.基本用法 ##情形1 $name = laravel5 <div class="title"> {{$name}} {{$name}}</div> //输出结果是 larave5 larave5 ##情形2 $name = laravel5 并且使用@的情形 <div class="title"> {{$name}} @{{$name}}</div> //输出结果是 larave5{{$name}} ##情形

Jinja2模板引擎简介

视图函数的作用是 : 处理业务逻辑和返回响应内容. 在开发中,把业务逻辑和表现内容放在一起,会增加代码的复杂度和维护成本,这个时候使用模板,让它来承担返回响应的内容,能够使代码结构清晰,耦合度低 模板是一个包含响应文本的文件,flask中常用的是Jinja2这个模板引擎来渲染模板  渲染就是使用真实值替换变量,返回字符串的过程. Jinja 是模板引擎,是由python实现的模板语言,flask内置的模板语言. 模板语言是一种被设计来自动生成文档的简单文本格式. 项目下创建template文件夹

flask jinja2模板引擎

from flask import Flask, jsonify,render_templateapp = Flask(__name__) @app.route("/")def hello(): return jsonify({"username":"hello world! Zhang"}) @app.route("/jinja2")def jinja2(): return render_template('jinja2.h

配置freemarker(模板引擎)

<properties> <freemarker.version>2.3.23</freemarker.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifact

flask 模板引擎

# 模板引擎 ### 蓝本使用 - 说明: 当大量视图函数放在一个文件中,很明显是不合适的.最好的时解决方案是根据需要将相关的视图函数放在单独的文件中.蓝本就是为了解决这个问题而出现的. - 使用: ```python # 导入蓝本 from flask import Blueprint # 创建对象,可以统一指定路由前缀 user = Blueprint('user', __name__, url_prefix='/user') # 添加视图函数 @user.route('/login/')

SaltStack 使用 Jinja2 模板

Jinja2 是基于 python 的一个模板引擎,如下,使用 Jinja2 实现根据不同的操作系统分发不同的文件: [[email protected] ~]$ cat /srv/salt/test.sls {% set apache_conf = '/etc/httpd/conf/httpd.conf' %} # {% set ... %} 用于设置变量 {% if grains['os'] == 'Debian' %} # {% if ... %} 用于条件判断,用 {% endif %}

python tornado框架实现CRUD

1.本例采用postgresql数据库,创建数据表 user_tbl create table user_tbl(name varchar(20),signup_date date); 2.webapi接口 (1)tornado框架配置 t_tornado.py #-*- coding:UTF-8 -*- import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from t