tornado四:拆分server、路由Application
一、配置文件config.py仿照django.settings:
配置文件config.py,分为参数部分和配置部分数
import os # 基本目录就是项目所在的目录,得到的BASE_DIRS是绝对目录 BASE_DIRS = os.path.abspath(os.path.dirname(__file__)) # 参数 options = { "port":9000 } # 配置,同django.settings settings = { "debug": True, "static_path": os.path.join(BASE_DIRS, "static"), "template_path": os.path.join(BaseException, "templates") } # 以上三项settings配置是tornado.web.Application中的基本配置
二、拆分视图函数Handler:
将视图函数独立,新建views.index.py文件
from tornado.web import RequestHandler class IndexHandler(RequestHandler): def get(self, *args, **kwargs): self.write('这是index视图函数') def post(self, *args, **kwargs): self.write("这是index视图函数") class HomeHandler(RequestHandler): pass
三、拆分路由和配置函数Application:
将Application类独立,新建application.py,继承自tornado.web.Application。
在子类中的初始化方法中,写路由;调用父类的初始化方法处理路由,即可。
# coding=utf-8 import tornado.web.Application from views import index import config class Application(tornado.web.Application): def __init__(self): handlers = [ (r'/', index.IndexHandler), ('r/home/', index.HomeHandler, {"key1": 'nice', "key2": 'good'}), tornado.web.url(r'/page1', index.Page1Handler,{"key3": "haha", "key4": "heihei"}, name="index-name") ] super(Application, self).__init__(self, handlers, **config.settings)
仿照django的settings,将配置文件存放在config.py的settings字典中。
将路由和配置传递给父类的Application处理。
tornado.web.Application初始化方法的原型是:
def __init__(self, handlers=None, default_host=None, transforms=None,**settings):
**settings中包括debug, static等配置。
Application中的配置settings:
- debug:设置tornado是否工作在调试模式下,默认为False,即工作在生产模式,不会随代码的更新而自动重启。
当为True时,工作在调试模式时,特点:
1.自动重启。应用会监控代码文件,当有保存改动时会自动重启服务器,可以减少手动重启的次数;
如果保存后,代码有错误会导致重启失败;修改错误后需要手动重启。
2.取消缓存编译的模板。单独设置时,为{"compiled_template_cache": False}
3.取消缓存静态文件的hash值。单独设置时,为{“static_hash_cache": False}。当为True时,*.css?hash=234sadf文件,后面的hash值将被缓存,且自动不会更新。
4.提供追踪信息。单独设置时,为{"serve_tranceback":False}
如果仅仅只想要第1种功能自动重启,则要设置debug为False,同时单独设置autoload为True。settings ={"autoload": True, "debug":False}
或者deubg为True,其它3项都设置为False。
- static_path: 设置静态文件目录。
- template_path:设置模板文件目录。
- .........其它配置项。
Application中的路由:
- 简单的路由:(r'/', index.IndexHandler)
- 带参数的路由:(r'/home', index.IndexHandler, {"key1": "nice", "key2": "good"})。这里暂时由服务器传递的参数,如果改为由客户端传参,从request中传递。Handler怎么接受参数?在自定义的Handler视图函数中的initialize方法中接收,覆盖父类的此方法,父类的此方法为pass。
class HomeHandler(RequestHandler): def initialize(self, key1, key2): self.key1 = key1 self.key2 = key2 def get(self, *args, **kwargs): print self.key1, self.key2 self.write('这是home视图函数')
-
反向解析路由:tornado.web.url(r'/page1', index.Page1Handler,{"key3": "haha", "key4": "heihei"}, name="index-name"),类似于django中的路由。例如,此路径被其它路由引用,如果此路径变化了,那么引用的地方也要改变;但是如果使用反向代理(reverse.url(name的值)),那么引用的地方就不需要改变。
class Page1Handler(RequestHandler): def initialize(self, key3, key4): self.key1 = key3 self.key2 = key4 def get(self, *args, **kwargs): print self.key3, self.key4 self.write('这是home视图函数')
class IndexHandler(RequestHandler): def get(self, *args, **kwargs): # self.write('这是index视图函数') self.write("<a href='/page1'>跳转到page1</a>") # 此路由引用了page1,当page1的路由路径发生改变时,必须更改引用地方的路径,即上面href的路径也要跟着变
class IndexHandler(RequestHandler): def get(self, *args, **kwargs): # self.write('这是index视图函数') # self.write("<a href='/page1'>跳转到page1</a>") url = self.reverse_url("index-name") # 获取到name为'index-name'的路由中的正则路径匹配。 self.write("<a href='%s'>跳转到page1</a>" % (url)) # 如果page1路由中,定义了命名空间name。那么就可以在引用的地方使用反向代理(解析)reverse_url(命名空间name的值),
即现在根据命名空间来查找被引用的路由,那么现在引用部分只根命名空间的值有关,与路由中的路径值无关。
被引用中的路径无论怎么改变,都不会影响引用。
四、拆分后的服务器函数:
from application import Application import config import tornado.ioloop if __name__ == '__main__': app = Application() import tornado.httpserver httpServer = tornado.httpserver.HTTPServer(app) httpServer.bind(config.options["port"]) httpServer.start(1) tornado.ioloop.IOLoop.current().start()
posted on 2018-07-25 22:08 myworldworld 阅读(402) 评论(0) 收藏 举报
浙公网安备 33010602011771号