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