1. 程式人生 > >路由系統整合

路由系統整合

int routes 如果 utf driver == 架構 cati 修改

  我們都知道,一個大型購物網站都有前臺商品展示和後臺商品管理,比如京東,平時我們登錄的京東網站就是前臺商品展示,而商家使用的就是後臺管理,一般在架構方面,我們都據此把UI層分為兩個部分,比如後臺就是UIAdmin,而前臺就是UIWeb,為了松耦合,相應的路由需做出相應的調整.

  拿Tornado舉例,平時我們的路由關系都寫在一個文件下,那就是Tornado下的啟動文件,當前如果只有一個APP,這種方式能說的過去

application = tornado.web.Application([
    (r"/index", Index.IndexHandler),
    # (r"/ttee", Index.TteeHandler),
    (r"/add_type", Index.TteeHandler),
    (r"/get_data", Index.GetdataHandler),
    (r"/edit_title", Index.EditTitleHandler),
    (r"/edit_other", Index.EditOtherHandler),
],**settings)

  而此時要實現多個APP,寫在一起,難免有些難管理,怎麽實現分開管理呢?有人說,Tornado有二級域名可以顯示,技術點是沒錯的,並且實現分開管理

  • Tornado原生支持二級域名,方法-application.add_handlers(二級域名,[url匹配規則]),可以通過www.laoliu.com訪問web,admin.laoliu.com訪問後臺管理
import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")


class AdminHandler(tornado.web.RequestHandler):
    def get(self):
        self.write(‘hello admin‘)


class WebHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("hello web")


application = tornado.web.Application([
    (r"/index", MainHandler),  #localhost:9999/index
])

application.add_handlers(‘admin.laoliu.com‘,[
    (r"/index",AdminHandler),  #admin.laoliu.com:9999/index
])

application.add_handlers(‘www.laoliu.com‘,[
    (r‘/index‘, WebHandler),  #www.laoliu.com:9999/index
])

if __name__ == "__main__":
    application.listen(9999)
    tornado.ioloop.IOLoop.instance().start()

  如果想本地瀏覽器支持配置訪問二級域名,你還要必須配置本地電腦

  • C:\Windows\System32\drivers\etc\hosts 配置二級域名規則

技術分享圖片

  上面好像是做到url分開管理,但我覺得它分開的不過到位,我希望能夠像Django那樣,每個APP下有自己的url文件專門管理自己的url匹配規則,並且下次增加二級域名時,只要修改配置文件就是了,那怎麽處理了,來看看吧

技術分享圖片

  Tornado實現二級域名的函數,是要傳入兩個參數,一個是二級域名名稱,一個是url映射規則,其中url映射規則,也就是一個列表,直接放在各個app的url文件,而二級域名名稱,則放在系統下配置文件裏,每個二級域名,對應url文件路徑,和url文件下的列表變量為一個組合存放

url文件

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from .Controllers import Account
from .Controllers import Home

patterns = [
     (r"/Login.html$", Account.LoginHandler),
     (r"/CheckCode.html$", Account.CheckCodeHandler),
     (r"/Register.html$", Account.RegisterHandler),
     (r"/Index.html$", Home.IndexHandler),
     (r"/Detail-(?P<product_id>\d+)-(?P<price_id>\d+).html$", Home.DetailHandler),
     (r"/Pay.html$", Home.PayHandler),
     (r"/", Home.IndexHandler),
]

config配置文件

routes = (
    {
        ‘host_pattern‘: ‘www.wupeiqi.com‘,
        ‘route_path‘: ‘UIWeb.Urls‘,
        ‘route_name‘: ‘patterns‘
    },
    {
        ‘host_pattern‘: ‘admin.wupeiqi.com‘,
        ‘route_path‘: ‘UIAdmin.Urls‘,
        ‘route_name‘: ‘patterns‘},
    {
        ‘host_pattern‘: ‘dealer.wupeiqi.com‘,
        ‘route_path‘: ‘UIDealer.Urls‘,
        ‘route_name‘: ‘patterns‘
    }
)

  做到我所說的分離後,最後一步就是定義一個url加載方法,在程序啟動時,加載進入這些url規則了

def load_routes(app):
    for route in Config.routes:
        host_pattern = route[‘host_pattern‘]
        route_path = route[‘route_path‘]
        route_name = route[‘route_name‘]

        m = __import__(route_path, fromlist=True)
        pattern_list = getattr(m, route_name)

        app.add_handlers(host_pattern, pattern_list)

  啟動程序

    application = tornado.web.Application([
        #(r"/index", home.IndexHandler),
    ], **settings)

    load_routes(application)

    # load_hook()
    # print(‘http://127.0.0.1:8888‘)

    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

  到這,目的已經做到了,以後我們只要在config裏配置二級域名,以及二級域名要對應哪個app下的url文件路徑,各自app管理設計url規則

路由系統整合