tornado 中的模板,模块的使用 和 加载静态资源

tornado 中的模板使用

import random
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, parse_config_file, options
from tornado.web import Application, RequestHandler, UIModule

define('port', type=int, default=8888, multiple=False)
parse_config_file('config')

class IndexHandler(RequestHandler):
    def get(self, *args, **kwargs):
        self.render('login.html')  # 向客户端发送模板

class NewHandler(RequestHandler):
    def post(self, *args, **kwargs):
        uname = self.get_arguments('uname')[0]
        upwd = self.get_arguments('upwd')[0]
        if uname == 'abc' and upwd == '123':
            self.render('news.html') # 向客户端发送模板
        else:
            self.redirect('/?msg=false')  # 页面的跳转

class LoginModule(UIModule):
    ''' 创建自定义的模块类 '''
    def render(self, *args, **kwargs):
        msg = ''
        if self.request.query:  # 获取url中的参数
            msg = '用户名或密码错误'
        return self.render_string('module/module_login.html', result=msg) # 渲染页面,并传递参数

class NewModule(UIModule):
    ''' 创建自定义的模块类 '''
    def myrand(self, a, b):
        return random.randint(a, b)  # 自定义的随机函数

    def render(self, *args, **kwargs):
        return self.render_string('module/module_news.html',
                                  num1=100,
                                  num2=200,
                                  myrand=self.myrand,  # 往模板中传入自定义的函数
                                  new_list=[{'title': '新闻第一线',
                                             'tag': ['新闻', '新型冠状病毒'],
                                             'contents': '新闻全部内容',
                                             'img': '0.jpg'},
                                            {'title': '新闻时刻',
                                             'tag': ['新闻', '科比逝世'],
                                             'contents': '新闻全部内容',
                                             'img': '1.jpg'},
                                            ]
                                  ) # 渲染页面,并传递参数

url_list = [('/', IndexHandler),
            ('/new', NewHandler)]

app = Application(url_list,
                  template_path='F:/mytornado/tornado_model/mytemplates',  # 指定模板的位置
                  static_path='F:/mytornado/tornado_model/mytemplates/mystatic', # 指定静态资源的位置
                  ui_modules={'login_module':LoginModule, 'new_module': NewModule}) # 指定模块的参数
server = HTTPServer(app)
server.listen(options.port)
IOLoop.current().start()

<html lang="en">
<head>
	
    <meta charset="UTF-8">
    <title>{% block title %} {% end %}title>
    {% block head %} {% end %}
head>
<body>
    {% block body %} {% end %}
body>
html>

{% extends base.html %}   
{% block title %} 登录 {% end %}  
{% block head %} <script src="{{ static_url('js/jquery-2.1.1.js') }}">script> {% end %} 

{% block body %}
    {% module login_module()%} 
{% end %}

<form method="post" action="/new">
    <p>
        用户名:<input type="text" name="uname">
    p>
    <p>
        密码:<input type="password" name="upwd">
    p>
    <p>
        <input type="submit" value="登陆">
    p>
form>
<p>{{ result }}p>

{% extends base.html %}
{% block title%} News {% end %}

{% block body %}
    {% module new_module() %}
{% end %}

{% for new in new_list %}
<table border="1px" cellpadding="5px" width="100%">
    <tr><td rowspan="4" align="center" width="100px">
        <table>
            <tr><td><img width="128px"
                         hight="128px"
                         src="{{static_url('images/'+new['img'])}}"
                         align="center">td>tr>  
            <tr><td align="center"><p style="width: 100px;
                                    border: 1px solid yellowgreen;
                                    white-space: nowrap;
                                    overflow: hidden;
                                    text-overflow: ellipsis">python小子p>td>tr>
         table>td>
         <td>{{ new['title'] }}td> 
    tr>
    <tr><td>{{ ' '.join(new['tag']) }}td>tr>  
    <tr><td style="min-height: 150px; display: block">{{ new['contents'] }}td>tr>
    <tr><td align="right">点赞数:{{ num1 }};
                          评论数:{{ num2 }};
                          阅读数:{{ num1 + num2 }};
                          转发数:{{ myrand(50,100) }}td>tr>  
table>
{% end %}
  • 函数:
    • app = Application(url_list, template_path=’…’, static_path=’…’, ui_modules={})
      • 参数url_list:路由列表,列表的每个元素为一个元组,如(’/’, IndexHandler)
      • 参数template_path:指定模板所在的文件夹
      • 参数static_path:指定静态资源所在的文件夹
      • 参数ui_modules:参数值为一个字典,键为页面中要加在的模块名,值为一个自定义的类名
    • self.render(‘index.html’, name1, name2…)
      • 参数 ‘index.html’:模板名称
      • name1, name2… :需要向模板中传递的参数,键名为name1,name2…
    • 模板获取参数值:
      • 在html文件中采用{{ }}获取
      • {{ name1 }} {{ name2 }} 获取一般参数值
      • {{ obj[‘name1’] }} {{ obj[‘name2’] }} 获取字段参数值
      • {{ function(name1,name2) }} 获取函数的返回值
    • 页面中加载静态资源
      • {{ static_url( str ) }} 加载静态资源
      • 参数str:静态资源的路径
      • 例如:{{ static_url(‘js/jquery-2.1.1.js’) }} 加载jQuery 文件
      • {{ static_url( ‘images/’ + new[ ‘img’ ] ) }} 加载静态资源图片
    • 模板中加载模块
      • {% extends ***.html %} 继承自某个页面
      • {% block name %} {% end %} 被替换的内容
      • {% block name %} contents {% end %} 用contents替换被继承的模板页面
      • {% module login_module()%} 加载模块,login_module是后台Application函数的ui_module参数中键名
  • 说明
    • 1、输入用户名和密码不正确时,返回首页带msg参数,判断msg参数有值,提示 用户名密码错误
    • 2、在模板中使用if 或 for语句时,需要写{% end %},不需要写{% endif %} 或者{% endfor %}
    • 3、可以在模板中直接使用python的内置函数和自定义的函数
    • 4、‘ ’.join(list):可以直接分割列表内的元素

你可能感兴趣的:(tornado)