闪电龟龟--笔记

万物寻其根,通其堵,便能解其困。
随笔 - 169, 文章 - 0, 评论 - 1, 阅读 - 79596
  博客园  :: 新随笔  :: 管理

使用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 %}

 

编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示