三、tornado.web.Application
1、Application:tornado.web.Aplication新建一个应用,可通过直接实例化这个类或实例化它的子类来新建应用;
2、handlers:实例化时至少需要传入参数handlers,handlers为元素为元组的列表,元组中第一个元素为路由,第二个元素为路由对应的RequestHandler处理类;路由为正则表达式,当正则表达式中有分组时,访问时会将分组的结果当做参数传入模板中;
3、settings:还有一个实例化时经常用到的参数settings,这个参数是一个字典:
①template_path:设置模板文件(HTML文件);
②static_path:设置静态文件(如图像、CSS文件、JavaScript文件等)的路径;
③debug:设置成True时开启调试模式,tornado会调用tornado.autoreload模块,当Python文件被修改时,会尝试重新启动服务器并在模板改变时刷新浏览器(在开发时使用,不要在生产中使用);
④ui_modules:设置自定义UI模块,传入一个模块名(变量名)为键、类为值的字典,这个类为tornado.web.UIModule的子类,在HTML中使用{% module module_name %}时会自动包含module_name类中render方法返回的字符串(一般为包含HTML标签内容的字符串),如果是HTML文件,返回的就是HTML模板中内容的字符串。
4、数据库:可以在Application的子类中连接数据库“self.db = database”,然后在每个RequestHandler中都可以使用连接的数据库“db_name = self.application.db.database”。
1 # 定义了模板路径和静态文件路径后,在使用到模板和静态文件的地方就不需要逐一添加和修改了 2 settings = { 3 'template_path': os.path.join(os.path.dirname(__file__), 'templates'), 4 'static_path': os.path.join(os.path.dirname(__file__), 'static'), 5 'debug': True, 6 } 7 8 # 对应的RequestHandler类代码未贴出来 9 app = tornado.web.Application( 10 handlers=[(r'/',MainHandler),
11 (r'/home', HomePageHandler),
12 (r'/demo/([0-9Xx\-]+)', DemoHandler), # 有分组时会将分组结果当参数传入对应的模板中
13 ],
14 **settings
15 )
1 class Application(tornado.web.Application): 2 def __init__(self): 3 handlers = [ 4 (r'/', MainHandler), 5 (r'/demo/([0-9Xx\-]+)', DemoHandler), 6 ] 7 8 settings = dict( 9 template_path=os.path.join(os.path.dirname(__file__), 'templates'), 10 static_path=os.path.join(os.path.dirname(__file__), 'static'), 11 ui_modules={'Mymodule': Mymodule}, 12 debug=True, 13 ) 14 15 # 这里使用的数据库是MongoDB,Python有对应的三方库pymongo作为驱动来连接MongoDB数据库 16 conn = pymongo.MongoClient() 17 self.db = conn['demo_db'] 18 tornado.web.Application.__init__(self, handlers, **settings) 19 20 class DemoHandler(tornado.web.RequestHandler): 21 def get(self): 22 demo_db = self.application.db.demo_db # 直接使用连接的数据库 23 sets = demo_db.find() 24 self.render( 25 'demo.html', 26 sets=sets, 27 ) 28 29 class Mymodule(tornado.web.UIModule): 30 def render(self): 31 return self.render_string('modules/mod.html',) 32 33 # 定义css文件路径 34 def css_files(self): 35 return '/static/css/style.css' 36 37 # 定义js文件路径 38 def javascript_files(self): 39 return '/static/js/jquery-3.2.1.js'