Tornado 模塊化

模塊化:將各種負責處理不同功能的代碼封裝在不同的類型中,將各種相似功能的類型封裝在py模塊中,通過模塊和模塊之間的相互協同完成功能的整體流程的開發實現的過程,稱之為模塊化開發。
在tornado框架的基礎上,可以實現開發人員自定義的MVC開發模式。
一般參考Django的項目文件結構。

完整的web項目組成部分:
 ?。?網頁視圖[templates]
  *靜態資源[static]
 ?。獢祿P蚚models]
 ?。獢祿P凸芾韀models_manager]
  *視圖處理類[views]
 ?。椖柯酚膳渲眯畔urls]
  *項目配置信息[settings]
?。绦騿拥娜肟赱main]
形成一個完整web項目的文件結構,這樣的結構一旦完成,利于高擴展和高維護性。

  • main文件 主項目啟動

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

        #項目配置信息模塊
        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,
              ......
        }
    
        # 緩存數據庫redis配置
        redis_config = {
              .....
        }
        ......
    
    
  • urls 文件 路由配置

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

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

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

        # 引入需要的模塊
        from sqlalchemy import create_engine
        from sqlalchemy.orm import sessionmaker
        #使用MySQL數據庫
        import pymysql
        pymysql.install_as_MySQLdb()
        #導入自己拆分的數據類型模塊
        from . import models
    
        # 定義一個基礎管理類
        class BaseManager:
             def __init__(self):
             # 創建數據庫引擎
             self.engine = create_engine("mysql://root@localhost/py1709_torn_db1",
                                          encoding="utf-8", echo=True)
             # 創建連接會話
             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("這個函數必須重寫")
             def find_condition(self, **kwargs):
                  raise Exception("這個函數必須重寫")
    
        #定義某個類型的具體管理類
        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__ ' 文件 使各個模塊默認為一個包。
    一樣創建templates文件和static文件存放網頁和靜態文件

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • (一)、啟動服務器 (二)、創建數據庫表 或 更改數據庫表或字段 Django 1.7.1及以上 用以下命令 1....
    夏天夏星閱讀 5,685評論 0 17
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 回家后幾次可數的出門望風,都是在我爸的威逼利誘下進行的。每次出門又是裹得嚴嚴實實的,其實我很想戴一條圍巾,不是冷...
    93那年晴喲閱讀 133評論 0 0
  • 什么是CSS hack? 不同廠商的瀏覽器,或同一廠商不同版本的瀏覽器,對css的解析識別是不一樣的,因此同樣的一...
    LeeoZz閱讀 210評論 0 0
  • 大眾書局福州路店因為租約到期,所以平安夜是大眾書局的最后一天營業,這個上海唯一一家24小時營業的書店,就要和大家告...
    靈魂有趣的總舵主閱讀 469評論 0 1