8-tornado中模板的使用(通过字符串返回、通过模板Template返回、通过模板render返回)、模板案例

1 Template

1.1 通过字符串返回

python 复制代码
import tornado
class IndexHandler(web.RequestHandler):
    def get(self):
        arg = 'Template'
        self.finish(f'<h1>Hello {arg}!!</h1>')

1.2 通过模板Template返回

tornado.template

一个简单的模板系统,将模板编译为Python代码。

基本用法如下

python 复制代码
class IndexHandler1(web.RequestHandler):
    def get(self):
        arg = 'Template1'
        t = template.Template(f'<h1>Hello {arg}!!</h1>')
        self.finish(t.generate())

class IndexHandler2(web.RequestHandler):
    def get(self):
        arg1 = 'Template2'
        t = template.Template('<h1>Hello {{arg}}!!</h1>')
        self.finish(t.generate(arg = arg1))

class IndexHandler3(web.RequestHandler):
    def get(self):
        arg1 = 'Template3_file'
        loader = template.Loader('./templates/')
        self.finish(loader.load('index.html').generate(arg = arg1))
html 复制代码
<!-- templates/index.html -->
<h1>Hello {{arg}}!!</h1>

1.3 通过模板render返回

python 复制代码
class IndexHandler4(web.RequestHandler):
    def get(self):
        arg1 = 'render_Template3_file'
        self.render('index.html',arg=arg1)     

2 模板案例

*前端

html 复制代码
   <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8"/>
    <title>购物车</title>
    <link rel="stylesheet" type="text/css" href="{{ static_url('css/style.css') }}" />
    <script src="{{ static_url('js/html5.js') }}"></script>
    <script src="{{ static_url('js/jquery.js') }}"></script>
    <script>
    $(document).ready(function(){
      $("nav .indexAsideNav").hide();
      $("nav .category").mouseover(function(){
    	  $(".asideNav").slideDown();
    	  });
      $("nav .asideNav").mouseleave(function(){
    	  $(".asideNav").slideUp();
    	  });
    });
    </script>
    </head>
    <body>
    <!--header-->
    <header>
      <!--topNavBg-->
      <div class="topNavBg">
       <div class="wrap">
       <!--topLeftNav-->
        <ul class="topLtNav">
         <li><a href="login.html" class="obviousText">亲,请登录</a></li>
         <li><a href="register.html">注册</a></li>
         <li><a href="#">移动端</a></li>
        </ul>
       <!--topRightNav-->
        <ul class="topRtNav">
         <li><a href="user.html">个人中心</a></li>
         <li><a href="cart.html" class="cartIcon">购物车<i>0</i></a></li>
         <li><a href="favorite.html" class="favorIcon">收藏夹</a></li>
         <li><a href="user.html">商家中心</a></li>
         <li><a href="article_read.html" class="srvIcon">客户服务</a></li>
         <li><a href="union_login.html">联盟管理</a></li>
        </ul>
       </div>
      </div>
      <!--logoArea-->
      <div class="wrap logoSearch">
       <!--logo-->
       <div class="logo">
        <h1><img src="{{ static_url('img/logo.png')}}"/></h1>
       </div>
       <!--search-->
       <div class="search">
        <ul class="switchNav">
         <li class="active" id="chanpin">产品</li>
         <li id="shangjia">商家</li>
         <li id="zixun">搭配</li>
         <li id="wenku">文库</li>
        </ul>
        <div class="searchBox">
         <form>
          <div class="inputWrap">
          <input type="text" placeholder="输入产品关键词或货号"/>
          </div>
          <div class="btnWrap">
          <input type="submit" value="搜索"/>
          </div>
         </form>
         <a href="#" class="advancedSearch">高级搜索</a>
        </div>
       </div>
      </div>
      <!--nav-->
      <nav>
    <ul class="wrap navList">
    <li class="category">
    <a>全部产品分类</a>
    <dl class="asideNav indexAsideNav">
    <dt><a href="channel.html">女装</a></dt>
    <dd>
    <a href="#">夏装新</a>
    <a href="#">连衣裙</a>
    <a href="#">T恤</a>
    <a href="#">衬衫</a>
    <a href="#">裤子</a>
    <a href="#">牛仔裤</a>
    <a href="#">背带裤</a>
    <a href="#">短外套</a>
    <a href="#">时尚外套</a>
    <a href="#">风衣</a>
    <a href="#">毛衣</a>
    <a href="#">背心</a>
    <a href="#">吊带</a>
    <a href="#">民族服装</a>
    </dd>
    <dt><a href="channel.html">男装</a></dt>
    <dd>
    <a href="#">衬衫</a>
    <a href="#">背心</a>
    <a href="#">西装</a>
    <a href="#">POLO衫</a>
    <a href="#">马夹</a>
    <a href="#">皮衣</a>
    <a href="#">毛衣</a>
    <a href="#">针织衫</a>
    <a href="#">牛仔裤</a>
    <a href="#">外套</a>
    <a href="#">夹克</a>
    <a href="#">卫衣</a>
    <a href="#">风衣</a>
    <a href="#">民族风</a>
    <a href="#">原创设计</a>
    <a href="#">大码</a>
    <a href="#">情侣装</a>
    <a href="#">开衫</a>
    <a href="#">运动裤</a>
    <a href="#">工装裤</a>
    </dd>
    </dl>
    </li>
    <li>
    <a href="index.html" class="active">首页</a>
    </li>
    <li>
    <a href="#">时尚搭配</a>
    </li>
    <li>
    <a href="channel.html">原创设计</a>
    </li>
    <li>
    <a href="channel.html">时尚代购</a>
    </li>
    <li>
    <a href="channel.html">民族风</a>
    </li>
    <li>
    <a href="information.html">时尚搭配</a>
    </li>
    <li>
    <a href="library.html">搭配知识</a>
    </li>
    <li>
    <a href="#">促销专区</a>
    </li>
    <li>
    <a href="#">其他</a>
    </li>
    </ul>
    </nav>
    
     </header>
     <script>
     $(document).ready(function(){
       //测试效果,程序对接如需变动重新编辑
       $(".switchNav li").click(function(){
         $(this).addClass("active").siblings().removeClass("active");
         });
       $("#chanpin").click(function(){
         $(".inputWrap input[type='text']").attr("placeholder","输入产品关键词或货号");
         });
       $("#shangjia").click(function(){
         $(".inputWrap input[type='text']").attr("placeholder","输入商家店铺名");
         });
       $("#zixun").click(function(){
         $(".inputWrap input[type='text']").attr("placeholder","输入关键词查找文章内容");
         });
       $("#wenku").click(function(){
         $(".inputWrap input[type='text']").attr("placeholder","输入关键词查找文库内容");
         });
       });
       
     </script>
     
    <section class="wrap" style="margin-top:20px;overflow:hidden;">
     <table class="order_table">
      <tr>
       <th><input type="checkbox"/></th>
       <th>产品</th>
       <th>名称</th>
       <th>属性</th>
       <th>单价</th>
       <th>数量</th>
       <th>小计</th>
       <th>操作</th>
      </tr>
      {% set total = 0 %}
      {% for order in  orders %}
      <tr>
       <td class="center"><input type="checkbox"/></td>
       <td class="center"><a href="product.html"><img src="{{order['img']}}" style="width:50px;height:50px;"/></a></td>
       <td><a href="product.html">{{order['name']}}</a></td>
       <td>
        <p>{{order['type']}}</p>
      
       </td>
       {% if order['price'] < 100 %}
       <td class="center"><span class="rmb_icon">优惠力度很大</span></td>
       {% else %}
       <td class="center"><span class="rmb_icon">{{order['price']}}</span></td>
       {% end %}
       <td class="center">
        <span>{{ order['num'] }}</span>
       </td>
       <!-- <td class="center"><strong class="rmb_icon">{{ order['price']*order['num'] }}</strong></td> -->
       <td class="center"><strong class="rmb_icon">{{ count_price(order['price'],order['num']) }}</strong></td>
       <td class="center">{% raw order['opts'] %}</td>  <!-- html 解析-->
       {{ total = total + count_price(order['price'],order['num']) }}
      </tr>
      {% end %}
     </table>
     <div class="order_btm_btn">
      <a href="index.html" class="link_btn_01 buy_btn"/>继续购买</a>
      <a href="order_confirm.html" class="link_btn_02 add_btn"/>共计金额<strong class="rmb_icon">{{ total }}</strong>立即结算</a>
     </div>
    </section>
    <!--footer-->
    <footer>
     <!--help-->
     <ul class="wrap help">
      <li>
       <dl>
        <dt>消费者保障</dt>
        <dd><a href="article_read.html">保障范围</a></dd>
        <dd><a href="article_read.html">退换货流程</a></dd>
        <dd><a href="article_read.html">服务中心</a></dd>
        <dd><a href="article_read.html">更多服务特色</a></dd>
       </dl>
      </li>
      <li>
       <dl>
        <dt>新手上路</dt>
        <dd><a href="article_read.html">保障范围</a></dd>
        <dd><a href="article_read.html">退换货流程</a></dd>
        <dd><a href="article_read.html">服务中心</a></dd>
        <dd><a href="article_read.html">更多服务特色</a></dd>
       </dl>
      </li>
      <li>
       <dl>
        <dt>付款方式</dt>
        <dd><a href="article_read.html">保障范围</a></dd>
        <dd><a href="article_read.html">退换货流程</a></dd>
        <dd><a href="article_read.html">服务中心</a></dd>
        <dd><a href="article_read.html">更多服务特色</a></dd>
       </dl>
      </li>
      <li>
       <dl>
        <dt>服务保障</dt>
        <dd><a href="article_read.html">保障范围</a></dd>
        <dd><a href="article_read.html">退换货流程</a></dd>
        <dd><a href="article_read.html">服务中心</a></dd>
        <dd><a href="article_read.html">更多服务特色</a></dd>
       </dl>
      </li>
     </ul>
     <dl class="wrap otherLink">
      <dt>友情链接</dt>
      <dd><a href="#" target="_blank">新码笔记</a></dd>
      <dd><a href="#" target="_blank">DethGhost</a></dd>
      <dd><a href="#">当当</a></dd>
      <dd><a href="#">优酷</a></dd>
      <dd><a href="#">土豆</a></dd>
      <dd><a href="#">新浪</a></dd>
      <dd><a href="#">钉钉</a></dd>
      <dd><a href="#">支付宝</a></dd>
     </dl>
     <div class="wrap btmInfor">
      <p>© 2060 版权所有 网络文化经营许可证:浙网文[2060]***-027号 增值电信业务经营许可证:浙B2-200***24-1 信息网络传播视听节目许可证:1109***4号</p>
      <address>联系地址:北京尚学堂科技有限公司</address>
     </div>
    </footer>
    </body>
    </html>

后端

python 复制代码
from tornado import web,template
from tornado import ioloop

class IndexHandler(web.RequestHandler):
    def count(self,price,num):
        return price*num
    def get(self):
        orders=[
            {   'id':1,
                'name':'MacPro 2060',
                'type':'32G',
                'price':9999,
                'num':1,
                'img':'static/img/goods.jpg',
                'opts':'<a href="delete?id=3">删除</a>'
            },
            {
                'id':2,
                'name':'HuaWei Mate 2060',
                'type':'512G',
                'price':6666,
                'num':1,
                'img':'static/img/goods007.jpg',
                'opts':'<a href="delete?id=3">删除</a>'
            },
            {   
                'id':3,
                'name':'Sony耳机',
                'type':'立体混音',
                'price':66,
                'num':2,
                'img':'static/img/goods008.jpg',
                'opts':'<a href="delete?id=3">删除</a>'
            },
        ]
        self.render('shop.html',orders=orders,count_price=self.count)


settings={
    'static_path':'./static/',
    'static_url_prefix':'/static2/',
    'template_path':'./templates'
}

if __name__ == '__main__':
    app = web.Application([
        ('/',IndexHandler),
        ],debug=True,
        **settings)
    app.listen(8000)
    ioloop.IOLoop.current().start()ok     
相关推荐
娃娃丢没有坏心思3 天前
解剖C++模板(1) —— 你从没仔细思考过的关键字
c语言·开发语言·c++·模板
2301_811212334 天前
python数据结构操作与可视化的应用
数据结构·python·信息可视化·django·virtualenv·pygame·tornado
职创未来官方8 天前
大话C++:第26篇 类模板
c++·面向对象·模板·模板类·嵌入式物联网·隐式实例化·显示实例化
纳贤猫NXM.COM15 天前
从0到1,解读安卓ASO优化!
android·python·django·flask·dubbo·tornado·dash
MasonYyp24 天前
Tornado简单使用
python·tornado
小柯J桑_25 天前
C++:模板进阶
c++·template method·模板
言之。1 个月前
【python3】tornado高性能编程
数据库·tornado
Amd7941 个月前
Nuxt.js 应用中的 app:templatesGenerated 事件钩子详解
自定义·编译·nuxt·模板·处理·钩子·vfs
api茶飘香1 个月前
淘宝商品评论API返回值中的品牌忠诚度评价
开发语言·python·django·flask·virtualenv·pygame·tornado
i02081 个月前
tornado
python·tornado