模塊化:將各種負(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)文件