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中的路由:
  1. 简单的路由:(r'/', index.IndexHandler)
  2. 带参数的路由:(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视图函数')
  3.  反向解析路由: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)    收藏  举报

导航