對flask項目進行簡單拆分:
修改成mvc模式:
-
使用 flask-script 拓展將
app.py 文件修改成manager.py -
修改項目結構:
路由管理:
- 直接將視圖寫到view.py 裏面是不會被加載到服務器的;
- 並且相互導入文件但是不能出現循環引用。
要解決的問題是: views需要導入app對象,但是app對象又需要調用到views。
-
故可以將app對象,放到app模塊中去實例化:
-
最後將路由註冊方法單獨的 views文件的函數中。函數需要一個參數app然後在app模塊的init文件中,新建一個app對象的時候,將對象帶進去這個函數,那麼路由就會綁定到這個app對象上面
最後manager文件將這個app對象啓動。
也就是app這個對象,是在views.py文件或者說views模塊中的 creat_app()函數中 進行實例化,之後也可以採取放到 app模塊的init.py文件中去
- 懶加載解決:
缺點,不能夠讓views裏面的結構分文件顯示只能在一個文件裏面寫route
通過參數的形式來傳遞。 - 代碼後附上:
#views.py:
def init_route(app):
@app.route('/')
def hello_world():
return 'Hello World!'
#init:
from flask import Flask
from App.views import init_route
def create_app():
app = Flask(__name__)
init_route(app)
return app
# manager.py
from App import create_app
app = create_app()
manager = Manager(app=app)
文件結構:
路由管理更好的方法-藍圖
-
路由的一種規劃,一種設計
-
flask-blueprint
-
bludeprint 使用出現問題。只要在文件裏面輸出參數 __name__就報錯
注意:名字定位錯誤。。。
結果: pycharm自動導包錯誤。
應該是:from flask import Blueprint
使用指南: 三種方法,推薦最後一種
-
在views文件中定義一個 Blueprint對象,然後在app生成後註冊到app裏面。在新的blueprint對象下面寫路由。
-
將views作爲模塊,在init.py文件中去引用其他文件,將其他文件生成的實例全部到init.py中引用:
from .first_blue import blue
依然還是在 app生成之後註冊。也就是在APP的init.py文件中註冊路由 -
在views 模塊中新建init_views()函數,然後注入app對象,在views模塊的init.py文件中進行路由的註冊。
路由返回模版對象:
使用 return render_template(‘index.html’)方法返回模版對象;
傳參數到模版裏面:render_template(‘index.html’,msg=‘這是信息’)//key-value傳值。
關係型數據庫(ORM):
- SQLALchemy //python都能用
- 使用flask-SQLALchemy
- 數據庫的uri:
數據庫+驅動://用戶名:密碼@主機:端口/具體哪一個庫
- 使用 Sqlite:
- SQLite是一種嵌入式數據庫,它的數據庫就是一個文件。由於SQLite本身是C寫的,而且體積很小,所以,經常被集成到各種應用程序中,甚至在iOS和Android的App中都可以集成。
Python就內置了SQLite3,所以,在Python中使用SQLite,不需要安裝任何東西,直接使用。
連接語句:
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sqlite.db'
注意事項 第一次在pycharm中使用,要記得安裝驅動;
進行測試連接:
定義模型類:繼承db.Model
SQLAlchemy的對象 db操作數據庫的語法:
# 創建:
db.crete_all()
# 刪除:
db.drop_all()
#添加
db.session.add()
db.session.commit()
- 換數據庫連接:使用mysql
- 例如連接我的mysql:
mysql+mysqlconnector://hhh:[email protected]:3306/hello
pycharm支持自己連接數據庫(輸入參數即可),可以少可開navicate去查看數據庫了。
注意事項
pycharm連接mysql之後,記得選擇schema文件。把自己的那個數據庫包括進去。不然看不到。
二級變化項目結構:setting.py,ext.py文件;
- 將數據庫的配置和初始化放到 ext.py文件中
- 項目設置放到setting.py文件中。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BkXYZp1k-1580110984894)(img/flask02/flask02-2020-01-21-02-05-54.png)]
感悟:python只能一個主文件,慢慢去調用其他文件。
在此拆分之後:
之後就可以通過在route裏面寫業務邏輯然後去調用db對象進行數據庫操作。
可以在模型裏面 添加sava方法:具體使用過程:
def save(self):
db.session.add(self)
db.session.commit()
終極拆分:
-
適應公司開發,多套環境:
- 開發環境:開發人員使用
- 測試環境:測試人員使用
- 演示環境:給產品看的,做演示,彩排
- 生產環境:線上真實部署。
-
將config 拿到setting.py文件中去:
- 在其中定義基礎配置類,開發,測試配置類。get數據庫uri方法。
-
然後給app添加config的時候,使用
app.config.from_object(envs.get('develop)')
env 裏面的develop變量可以從manager.py 傳入
將指定環境放到manage.py
//另外可以通過os.environ.get(‘FLASK_ENV’,‘develop’).實現通過電腦自動獲取 環境變量來指定環境
(其實也只是有點點用。。。)
- 如果新建一個表,通過orm映射成表之後,想要添加屬性。或者說添加表的字段。 直接create_db 是不能更新表結構的。
- 需要先 drop_db,在create才能更新表結構。
不能動態更新表;
數據庫遷移: flask-migrate擴展的使用
懶加載方式,需要db,app對象來進行初始化
migrate = Migrate()
def init_ext(app):
db.init_app(app=app)
# 初始化管理者,需要app
migrate.init_app(app,db)
- 命令行結合 flask-scirpt 使用:
# 初始化
python manager.py db init
# 檢查表加表
python manager.py db migrate
# 更新到數據庫
python manager.py db upgrade
到此爲止 對應java ssh
前端的 route 對應 寫接口,應該掉servece
model 也已經定義好了
servece 調用mapper (直接orm完成了)還沒搞好。
- 項目結構圖:
項目結構:
按照模塊拆分:
- user模塊裏面 有mvc三種文件;
- 每一個模塊裏面,都有三種文件:mvc v還是用的template
- 可以把某一個模塊拎出來放在主目錄外面。(我不喜歡分模塊寫models,和views)