Tornado 模塊化

模塊化:將各種負(fù)責(zé)處理不同功能的代碼封裝在不同的類型中坎匿,將各種相似功能的類型封裝在py模塊中盾剩,通過模塊和模塊之間的相互協(xié)同完成功能的整體流程的開發(fā)實現(xiàn)的過程雷激,稱之為模塊化開發(fā)替蔬。
在tornado框架的基礎(chǔ)上,可以實現(xiàn)開發(fā)人員自定義的MVC開發(fā)模式屎暇。
一般參考Django的項目文件結(jié)構(gòu)承桥。

完整的web項目組成部分:
  * 網(wǎng)頁視圖[templates]
 「俊*靜態(tài)資源[static]
 ⌒滓臁*數(shù)據(jù)模型[models]
  *數(shù)據(jù)模型管理[models_manager]
 〖费病*視圖處理類[views]
 ∈1颉*項目路由配置信息[urls]
  *項目配置信息[settings]
】蟊啊*程序啟動的入口[main]
形成一個完整web項目的文件結(jié)構(gòu)喉恋,這樣的結(jié)構(gòu)一旦完成,利于高擴展和高維護性母廷。

  • main文件 主項目啟動

         # web項目啟動的入口
         import tornado.web
         from tornado.httpserver import HTTPServer
         from tornado.ioloop import IOLoop
         #導(dǎo)入拆分的路由丶設(shè)置模塊
         from mymodules import urls, settings
    
         # 自定義Application轻黑,繼承tornado的Appliation,方便擴展增加新功能
         class Application(tornado.web.Application):
               def __init__(self):
                    #添加自己的模塊設(shè)置
                    super().__init__(urls.urlpatterns, **settings.common)
    
          # 自定義主函數(shù)
          def main():
               # 構(gòu)建一個app應(yīng)用
               app = Application()
              # 部署項目
              server = HTTPServer(app)
              server.listen(8000)
              # 啟動輪詢監(jiān)聽
              IOLoop.current().start()
    
          # 啟動項目
          if __name__ == "__main__":
                main()
    
    
  • setting 文件 項目設(shè)置

        #項目配置信息模塊
        import os
        BASE_DIR = os.path.dirname(__file__)
    
        # 公共配置
        common = {
              "template_path": os.path.join(BASE_DIR, "templates"),
              "static_path": os.path.join(BASE_DIR, "static"),
              "debug": True,
              ......
        }
    
        # 緩存數(shù)據(jù)庫redis配置
        redis_config = {
              .....
        }
        ......
    
    
  • urls 文件 路由配置

        #路由設(shè)置琴昆,導(dǎo)入拆分的視圖處理模塊
        from . import views
        urlpatterns = [
            (r'/', views.IndexHandler),
             ......
        ]
    
    
  • views 文件 視圖處理

        # 引入需要的模塊
        from tornado.web import RequestHandler
        #導(dǎo)入自己定義的數(shù)據(jù)模型 models 模塊 或 數(shù)據(jù)管理器 models_manager 模塊
        from . import models_manager
    
        # 定義一個基礎(chǔ)處理類型用于繼承
        class BaseHandler(RequestHandler):
              # 方便后續(xù)對RequestHandler進行擴展
              # 增加新的公共功能之后氓鄙,所有自定義的Handler類型都會具備這個功能
              pass
    
        # 定義主頁視圖處理類
        class IndexHandler(BaseHandler):
              def get(self):
                    # 查詢所有的用戶信息
                    person_list = models_manager.PersonManager().find_condition()
                    self.render("index.html", plist=person_list)
    
        # 定義其他視圖處理類
        ......
    
    
  • models 文件 數(shù)據(jù)模型

        #需要的模塊
        from sqlalchemy import Column, String, Integer
        from sqlalchemy.ext.declarative import declarative_base
    
        # 構(gòu)建一個基礎(chǔ)類型,可后期擴展
        Base = declarative_base()
    
        # 定義自定義數(shù)據(jù)類型
        class Person(Base):
              # 指定關(guān)聯(lián)的表數(shù)據(jù)
              __tablename__ = "person"
              # 定義屬性字段
              id = Column(Integer, primary_key=True)
              name = Column(String(50))
              age = Column(Integer)
    
    
  • models_manager 數(shù)據(jù)模型管理器

        # 引入需要的模塊
        from sqlalchemy import create_engine
        from sqlalchemy.orm import sessionmaker
        #使用MySQL數(shù)據(jù)庫
        import pymysql
        pymysql.install_as_MySQLdb()
        #導(dǎo)入自己拆分的數(shù)據(jù)類型模塊
        from . import models
    
        # 定義一個基礎(chǔ)管理類
        class BaseManager:
             def __init__(self):
             # 創(chuàng)建數(shù)據(jù)庫引擎
             self.engine = create_engine("mysql://root@localhost/py1709_torn_db1",
                                          encoding="utf-8", echo=True)
             # 創(chuàng)建連接會話
             Session = sessionmaker(bind=self.engine)
             self.session = Session()
             #公用方法
             def update_obj(self, **kw):
                  self.session.commit()
             def delete_obj(self, **kw):
                  self.session.delete(**kw)
                  self.session.commit()
             def find_single(self, **kwargs):
                  raise Exception("這個函數(shù)必須重寫")
             def find_condition(self, **kwargs):
                  raise Exception("這個函數(shù)必須重寫")
    
        #定義某個類型的具體管理類
        class PersonManager(BaseManager):
            def find_single(self, **kwargs):
                 return self.session.query(models.Person).filter(**kwargs).one()
            def find_condition(self, **kwargs):
                 return self.session.query(models.Person).filter(**kwargs)
            def create_obj(self, **kw):
                 p = Person(**kw)
                 self.session.add(p)
                 self.session.commit()
    
  • 附加
    添加一個' __init__ ' 文件 使各個模塊默認(rèn)為一個包业舍。
    一樣創(chuàng)建templates文件和static文件存放網(wǎng)頁和靜態(tài)文件

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抖拦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子舷暮,更是在濱河造成了極大的恐慌态罪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脚牍,死亡現(xiàn)場離奇詭異向臀,居然都是意外死亡,警方通過查閱死者的電腦和手機诸狭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門券膀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來君纫,“玉大人,你說我怎么就攤上這事芹彬⌒钏瑁” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵舒帮,是天一觀的道長会喝。 經(jīng)常有香客問我,道長玩郊,這世上最難降的妖魔是什么肢执? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮译红,結(jié)果婚禮上预茄,老公的妹妹穿的比我還像新娘。我一直安慰自己侦厚,他們只是感情好耻陕,可當(dāng)我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刨沦,像睡著了一般诗宣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上想诅,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天召庞,我揣著相機與錄音,去河邊找鬼侧蘸。 笑死裁眯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的讳癌。 我是一名探鬼主播穿稳,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晌坤!你這毒婦竟也來了逢艘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骤菠,失蹤者是張志新(化名)和其女友劉穎它改,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體商乎,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡央拖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲜戒。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡专控,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出遏餐,到底是詐尸還是另有隱情伦腐,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布失都,位于F島的核電站柏蘑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粹庞。R本人自食惡果不足惜咳焚,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望信粮。 院中可真熱鬧黔攒,春花似錦、人聲如沸强缘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旅掂。三九已至,卻和暖如春访娶,著一層夾襖步出監(jiān)牢的瞬間商虐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工崖疤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留秘车,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓劫哼,卻偏偏與公主長得像叮趴,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子权烧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內(nèi)容

  • (一)眯亦、啟動服務(wù)器 (二)、創(chuàng)建數(shù)據(jù)庫表 或 更改數(shù)據(jù)庫表或字段 Django 1.7.1及以上 用以下命令 1....
    夏天夏星閱讀 5,658評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理般码,服務(wù)發(fā)現(xiàn)妻率,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 回家后幾次可數(shù)的出門望風(fēng)板祝,都是在我爸的威逼利誘下進行的宫静。每次出門又是裹得嚴(yán)嚴(yán)實實的,其實我很想戴一條圍巾,不是冷...
    93那年晴喲閱讀 131評論 0 0
  • 什么是CSS hack孤里? 不同廠商的瀏覽器温技,或同一廠商不同版本的瀏覽器,對css的解析識別是不一樣的扭粱,因此同樣的一...
    LeeoZz閱讀 200評論 0 0
  • 大眾書局福州路店因為租約到期琢蛤,所以平安夜是大眾書局的最后一天營業(yè)蜓堕,這個上海唯一一家24小時營業(yè)的書店,就要和大家告...
    靈魂有趣的總舵主閱讀 450評論 0 1