• 模板基础


    模板:

    在tornado中,模板就是一个html文件,但是模板通过模板语法,由tornado服务渲染之后,可以动态的往页面中填入数据 。tornado自带模板语法,不需要再用其他的模板插件

    模板初识:

    之前我们通过render可以返回一个html页面,不过那都是固定的页面,固定的数据,但是如果数据是不确定的,是会不断改变的,该怎么做呢?

    是否可以先把页面写好,然后预留出固定的位置,在需要的时候再填入数据即可?

    04-templates.py文件:

    import tornado.web
    import tornado.ioloop
    import tornado.httpserver
    import tornado.options
    from tornado.web import RequestHandler
    from tornado.options import define,options
    
    define('port',default=8080,help='run server',type=int)
    
    
    class MainHandler(RequestHandler):
        def get(self):
            self.render('in_out.html')
        def post(self):
            name = self.get_argument('name','')
            self.write(name)
    
    
    class TemHandler(RequestHandler):
        def get(self):
            self.write('hello world')
        def post(self):
            name = self.get_argument('name','')
            self.render('02-templates.html',username= name)
    
    application = tornado.web.Application(
        handlers=[
            (r'/',MainHandler),
            (r'/tem',TemHandler),
        ],
        debug=True,
        template_path = 'templates',
        static_path='static'
    )
    if __name__ == '__main__':
        tornado.options.parse_command_line()
        http_server = tornado.httpserver.HTTPServer(application)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.current().start()

    请求的html表单,in_out.html:

    <body>
        <form method="post" action="/tem">
            <p>用户名<input type="text" name="name"></p>
            <p>密码<input type="password" name="password"></p>
            <input type="submit">
        </form>
    </body>

    返回的html模板,02-templates.html

    <body>
        欢迎 {{ username }} 登陆
    </body>

    模板语法,模板符号:

    {{ expression }}

    用 {{ expression }} 中间是任何 python 表达式,或者是一个变量

    {% directives %}

    其他的模板指令

    {# … #}

    在模板中要注释python表达式的运行,需要使用这个模板语法

    {{! {%! {#!

    如果不想执行内容,需要在页面上打印出模板符号,只需要加上感叹号( ! )即可。输出源代码

    控制语句:if判断

    在模板中可以使用 if 判断   注意:最后需要以 {% end %} 结尾

    实例如下:

    <body>
        欢迎 {{ username }} 登陆
        <br>
        {{ 1+1 }}
        <br>
        {{ time.ctime() }}
        <!--两个大括号可以运行python的表达式-->
        <br>
        <br>
    <!--控制流程-->   {#% %#}
        {% if username !='' %}
            欢迎 {{ username }} 登陆
        {% else %}
            请登录
        {% end %}
        <br>
        <br>
        <!--{{ time.ctime() }} 这种方式会在后台仍然执行 下面使用{# #}注释语法-->
        {# time.ctime() #}
    
        <br>
        <!--不进行运算,将表达式显示在页面-->
        {{! 1+1 }}  
    
    </body>

    循环语句:

    for 循环:

    在 tornado 模板中可以使用 for 循环 注意:最后需要以 {% end %} 结尾

    while 循环:

    在 tornado 模板中可以使用 while 循环 注意:最后需要以 {% end %} 结尾

    python文件中传入变量:

    class TemHandler(RequestHandler):
        def get(self):
            self.write('hello world')
        def post(self):
            urllist=[
                ('http://www.baidu.com','百度一下'),
                ('http://www.zhihu.com','知乎'),
                ('http://www.google.com','谷歌'),
            ]
            name = self.get_argument('name','')
            self.render('02-templates.html',
                        username= name,
                        time = time,
                        urllist = urllist,
                        )

    模板文件展示:

    <body>
         {% for i in urllist %}
        <a href="{{ i[0] }}" target="_blank">{{ i[1] }}</a>
        <br>
        {% end %}
        <br>
        <!--需要提前设置-->
        {% set a =0 %}
        {% while a < 8 %}
            {{ a }} <br>
        {% set a+=1 %}
        {% end %}
    </body>

    选择模板类型:File--->Setting--->Python Template Languages  (jinja2)

    模板转义

    转义:

    页面并没有解析,只是当作一个字符串,直接在页面上打印出来 tornado默认是自动的转义,传入的数据都会当作字符串,不会被浏览器解析

    class TemHandler(RequestHandler):
        def get(self):
            pass
        def post(self):
            atga ='''
            <a href="http://www.baidu.com" target="_blank">百度一下,你就知道</a>
            '''
            self.render('02-templates.html',
                        atga = atga
                        )
    
    application = tornado.web.Application(
        handlers=[
            (r'/',MainHandler),
            (r'/tem',TemHandler),
        ],
        debug=True,
        template_path = 'templates',
        static_path='static',
        autoescape = None, #全局取消转义
    )

    模板.html

    <!DOCTYPE html>
    {#取消整个页面的转义#}
    {#{% autoescape None %}#}
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Templates</title>
    </head>
    <body>
    {#    raw 局部取消转义#}
    {#    {%  raw atga %}#}
        <br>
    {#    批量取消转义两种方法,1。取消整个页面的转义。2.取消整个项目的转义#}
        {{ atga }}
        {{ atga }}
        {{ atga }}
        {{ atga }}
        {{ atga }}
        {{ atga }}
    {#    局部开启转义#}
        {{ escape(atga) }}
    </body>
    </html>

    静态文件引入

    设置静态资源目录

    application = tornado.web.Application(
        handlers=[
            (r'/',MainHandler),
            (r'/tem',TemHandler),
        ],
        debug=True,
        template_path = 'templates',
        static_path='static',   #设置静态资源文件位置
        autoescape = None, #全局取消转义
    )

    模板中引入静态资源:static_url为内置方法

    两种引入方式

    <body>
    {% if username !='' %}
        欢迎 {{ username }} 登录
    <img src="static/images/01.jpg" width="200px" alt="">
    <img src="{{ static_url('images/02.webp') }}" width="200px" alt="">
    {% else %}
        亲,请登录
    {% end %}
    </body>

    两种静态资源引入的不同:

  • 相关阅读:
    SQL 拾遗
    PowerDesigner技巧
    进步
    'data.csv'
    System.Web”中不存在类型或命名空间名称script /找不到System.Web.Extensions.dll引用
    要学的技术
    Sql 表变量
    Tomcat 7.0的配置
    开发工具
    jQuery UI Dialog
  • 原文地址:https://www.cnblogs.com/taoge188/p/10628699.html
Copyright © 2020-2023  润新知