Python tornado 之 表单与模板

1、说明

(1)通过self.render()使用模板

(2)使用表单,只要接收表单参数即可

示例功能:通过访问根目录,填写表单,提交后转到模板

demo1.py

import os.path

import tornado.ioloop
import tornado.web
from tornado.options import define
from tornado.options import options


class BaseHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('index.html')


class ShowHandler(tornado.web.RequestHandler):
    def post(self, ):
        name = self.get_argument('name')
        sex = self.get_argument('sex')
        birthday = self.get_argument('birthday')
        address = self.get_argument('address')
        kwargs = dict(name=name, sex=sex, birthday=birthday, address=address)
        self.render('show.html', **kwargs)


if __name__ == '__main__':
    # 定义端口, 可以全局使用options.port获取,可通过命令行更改
    define('port', default=8080, help='设置启动服务的端口', type=int)
    options.parse_command_line()  # 分析命令行参数
    application = tornado.web.Application(
        handlers=[('/', BaseHandler), ('/show', ShowHandler)],
        template_path=os.path.join(os.path.dirname(__file__), 'template')
    )  # 设置路由
    """
    /show 对应 index.html表单中的 action
    """
    # 监听端口8080,可以通过命令行改变,python xxx.py --port=8090
    application.listen(options.port)
    tornado.ioloop.IOLoop.current().start()  # 启动web服务

需要依赖模板文件

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>个人信息填写</h1>
<form method="post" action="/show">
    <p>姓名<br><input type="text" name="name"></p>
    <p>性别<br><input type="text" name="sex"></p>
    <p>出生年月<br><input type="date" name="birthday"></p>
    <p>家庭住址<br><input type="text" name="address"></p>
    <button type="submit">提交</button>
</form>
</body>
</html>

show.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>个人信息填写</h1>
<p>姓名:{{name}}</p>
<p>性别:{{sex}}</p>
<p>出生年月:{{birthday}}</p>
<p>家庭住址:{{address}}</p>
</body>
</html>

目录结构

步骤:

先写好index.html和show.html,然后在demo1.py同级目录下新建template文件夹

把index.html和show.html放在template文件夹中

因为以前接触过Django的模板,所以我这篇笔记不再解释模板,需要了解模板的可以参考我的学习链接或者自行谷歌

运行

访问 http://127.0.0.1:8080/

 点击提交后可以看到这样的画面

 

2、静态资源的配置

import os.path

import tornado.ioloop
import tornado.web
from tornado.options import define
from tornado.options import options


class BaseHandler(tornado.web.RequestHandler):
    def get(self):
        self.render('static_test.html')


if __name__ == '__main__':
    # 定义端口, 可以全局使用options.port获取,可通过命令行更改
    define('port', default=8080, help='设置启动服务的端口', type=int)
    options.parse_command_line()  # 分析命令行参数
    template_path = os.path.join(os.path.dirname(__file__), 'template')
    template_path = os.path.abspath(template_path)
    application = tornado.web.Application(
        handlers=[('/', BaseHandler)],
        template_path=template_path,
        static_path=os.path.join(template_path, 'static'),
        debug=True,  # 设置为debug模式
    )  # 设置路由
    # 监听端口8080,可以通过命令行改变,python xxx.py --port=8090
    application.listen(options.port)
    tornado.ioloop.IOLoop.current().start()  # 启动web服务

static_test.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test_Static_Resource</title>
</head>
<body>
<img border="0" src={{ static_url("images/1.jpeg") }} alt="Pulpit rock">
</body>
</html>

模板中使用static_url来获取静态资源的路径,会自动转化成项目对应的路径

例如 /static/images/1.jpeg?v=6d10f38c02408f0463cc3dd8ffdb3967 v=xxx确保浏览器总是加载文件的最新版

目录结构

 运行

 

3、模板的语法

模板是基于from tornado.template import Template实现的

from tornado.template import Template


def test1():
    # 模板的普通替换
    string = """<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h1>个人信息填写</h1>
    <p>姓名:{{name}}</p>
    <p>性别:{{sex}}</p>
    <p>出生年月:{{birthday}}</p>
    <p>家庭住址:{{address}}</p>
    </body>
    </html>"""
    t = Template(string)
    obj = t.generate(name='南风丶轻语', sex='', birthday='2021-3-5', address='')
    content = obj.decode('utf-8')
    print(content)


def test2():
    # 模板 for 循环
    string = """
    <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
{% for name in names %}
<li>{{name}}</li>
{% end %}
</ul>
</body>
</html>
    """
    t = Template(string)
    obj = t.generate(names=['嘻嘻', '哈哈', '呵呵', '呱呱'])
    content = obj.decode('utf-8')
    print(content)


if __name__ == '__main__':
    test1()
    test2()

学习链接 http://doc.iplaypy.com/tornado/ch2.html 

posted @ 2021-08-04 20:27  南风丶轻语  阅读(132)  评论(0编辑  收藏  举报