zoukankan      html  css  js  c++  java
  • Tornado 模板(StaticFileHandler/static_path/template_path等) 笔记

    使用StaticFileHandler进行首页默认访问页面,最好将StaticFileHandler放在最后面,这样不会覆盖要匹配自定义的路径

    import tornado.web
    import tornado.ioloop
    import tornado.options
    import tornado.httpserver
    from tornado.options import options
    from tornado.web import RequestHandler, StaticFileHandler
    import os
    
    current_path = os.path.dirname(__file__)
    tornado.options.define('port', type=int, default=8000, help="服务器端口")
    
    class IndexHandler(RequestHandler):
        def get(self):
            self.write('OK')
    
    if __name__ == '__main__':
        tornado.options.parse_command_line()
        app = tornado.web.Application([
            (r'/(.*)', StaticFileHandler, dict(path=os.path.join(current_path, 'static/html'), default_filename='index.html')),
        ], debug=True)
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.current().start()

    static_path/template_path

    static_path:设置静态文件的访问目录

    template_path:设置静态页面路径

    static_url(): 根据设置的静态,目录寻找静态文件

    render():跳转文件,使用render默认的是模板转义。

    import tornado.web
    import tornado.ioloop
    import tornado.options
    import tornado.httpserver
    from tornado.options import options
    from tornado.web import RequestHandler, StaticFileHandler
    import os
    
    current_path = os.path.dirname(__file__)
    tornado.options.define('port', type=int, default=8000, help="服务器端口")
    
    class IndexHandler(RequestHandler):
        def get(self):
            # self.render('index.html')  # 跳转静态页面
            dict1 = {'name': 'namejr', 'age':22}
            self.render('index.html',dict1=dict1)  # 使用render()还可以传递参数
    
    if __name__ == '__main__':
        tornado.options.parse_command_line()
        app = tornado.web.Application([
            (r'/', IndexHandler),
            # 使用StaticFileHandler进行首页默认访问页面,最好将StaticFileHandler放在最后面,这样不会覆盖要匹配自定义的路径
            (r'/(.*)', StaticFileHandler, dict(path=os.path.join(current_path, 'static/html'), default_filename='index.html')),
        ], debug=True, static_path=os.path.join(current_path, 'static'), template_path=os.path.join(current_path, 'templates'))
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.current().start()

    使用render()传递参数接收方法:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <!-- static_url使用静态资源文件 -->
        <link rel="stylesheet" type="text/css" href="{{ static_url('css/index.css') }}">
    </head>
    <body>
    <h1>namejr</h1>
    <p>name :{{ dict1['name'] }}, age:{{ dict1['age'] }}</p>
    </body>
    </html>

    除了上述案例中的将每个debug/static_path/template_path单独添加到tornado.web.Application()中之外,还可以使用**setting

    import tornado.web
    import tornado.ioloop
    import tornado.options
    import tornado.httpserver
    from tornado.options import options
    from tornado.web import RequestHandler
    import os
    
    tornado.options.define('port', type=int, default=8000, help="服务器端口")
    current_path = os.path.dirname(__file__)
    setting = dict(debug=True, template_path=os.path.join(current_path, 'templates'), static_path=os.path.join(current_path, 'static'))
    
    class IndexHandler(RequestHandler):
        def get(self):
            self.render('new.html')
    
    if __name__ == '__main__':
        tornado.options.parse_command_line()
        app = tornado.web.Application([
            (r'/', IndexHandler),
        ], **setting)
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.current().start()

    关于静态文件使用if..else..等语句

    {% if %}...{% elif %}..{% else %}...{% end %}

    {% for %} {% end %}

    即使用{%%}方式执行python语句,使用{{ num }} 接收静态参数

    如何修改render()不进行转义?

    下面有这几种方法:

    第一种:关闭整个网站的模板转义

    在tornado.web.Application()添加参数autoescape=None

    app = tornado.web.Application([
            (r'/', IndexHandler),
        ], debug=True, template_path=os.path.join(current_path, 'templates'), autoescape=None)

    注:在谷歌浏览器会自动拦截,可在控制台查看拦截原因

    第二种:关闭单个页面转义,{% autoescape None %}

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <form method="post">
        <textarea name='text'></textarea>
        <input type="submit" value="sub">
    </form>
    {% autoescape None %}
    {{ texts }}
    </body>
    </html>

    第三种:单条语句转义,{% raw texts %}

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <form method="post">
        <textarea name='text'></textarea>
        <input type="submit" value="sub">
    </form>
    {% raw texts %}
    </body>
    </html>

    第四种:关闭全局转义后想在单个页面进行不转义,{{ escape(texts) }}

    关于自定义处理函数

    # index.py
    import tornado.web
    import tornado.ioloop
    import tornado.options
    import tornado.httpserver
    from tornado.options import options
    from tornado.web import RequestHandler
    import os
    
    tornado.options.define('port', type=int, default=8000, help="服务器端口")
    current_path = os.path.dirname(__file__)
    
    # 构建处理函数
    def deal_dict(names):
        return ''.join(names)
    
    class IndexHandler(RequestHandler):
        def get(self):
            # 构建数据
            dict1 = [
                {
                    'name': ['n', 'a', 'm', 'e', 'j', 'r'],
                    'age': 21
                },
                {
                    'name': ['n', 'a', 'm', 'e', 'm', 'm'],
                    'age': 22
                },
                {
                    'name': ['n', 'a', 'm', 'e', 'm', 'b'],
                    'age': 23
                },
                {
                    'name': ['n', 'a', 'm', 'e', 'a', 'b'],
                    'age': 24
                }
            ]
            self.render('index.html', texts=dict1, func_deal_dict=deal_dict)
    
    if __name__ == '__main__':
        tornado.options.parse_command_line()
        app = tornado.web.Application([
            (r'/', IndexHandler),
        ], debug=True, template_path=os.path.join(current_path, 'templates'))
        http_server = tornado.httpserver.HTTPServer(app)
        http_server.listen(options.port)
        tornado.ioloop.IOLoop.current().start()
    index.html:
    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
    </head>
    <body>
        <table border="1">
            <!-- 进行解析数据 -->
            {% for text in texts %}
                <tr>
                    <!-- 使用函数处理 -->
                    <td>{{ func_deal_dict(text['name']) }}</td>
                    <td>{{ text['age'] }}</td>
                </tr>
            {% end %}
        </table>
    </body>
    </html>

     父子模板的使用:

    # 父模板(index.html)

    <!DOCTYPE html>
    <html>
    <head>
        <title>父模板</title>
    </head>
    <body>
    <header>
        <p>这是请求头</p>
        {% block header %}{% end %}
    </header>
    <center>
        <p>这是请求内容</p>
        {% block content %}{% end %}
    </center>
    </body>
    </html>

    # 子模板,使用extends继承父模板,用block来填充父模板挖的坑

    {% extends 'index.html' %}
    {% block header %}
        <span>标题</span>
    {% end %}
    {% block content %}
        <span>内容</span>
    {% end %}
  • 相关阅读:
    使用python scrapy爬取知乎提问信息
    [java基础]一文理解java多线程必备的sychronized关键字,从此不再混淆!
    python scrapy 登录知乎过程
    python scrapy爬虫框架概念介绍(个人理解总结为一张图)
    【干货】一文理解Druid原理架构(时序数据库,不是ali的数据库连接池)
    2016年我所面试过的那些公司
    写在2017年1月
    分页pagination实现及其应用
    inconsistent line count calculation in projection snapshot
    来去匆匆
  • 原文地址:https://www.cnblogs.com/namejr/p/10034498.html
Copyright © 2011-2022 走看看