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