第四章:FLASK結構拆分和循環引入問題
一,上節回顧:
1) flask 最小應用代碼。
from flask import Flask app = Flask(__name__) @app.route(‘/hello‘) def hello(): return ‘hello‘ if __name__ == ‘__main__‘: app.run()
2) flask 路由實現
@app.route(‘/‘) ,路由裝飾器,本質上是調用app.add_url_rule() 方法實現的路由規則
3) flask 啟動參數
host: 主機
port:端口
debug:是否開啟調試模式
4) if __name__ == ‘__main__‘ 的理解
在本文件中啟動 __name__ 就是 __main__
如果是導入其他模塊 __name__ 就是 模塊的名稱
5) 視圖函數和普通函數的區別?
普通函數:可以返回字符串,字典,元組,整型等基本數據類型
視圖函數:返回的是Response對象,包括但不限於狀態碼(status_code),返回類型(Content-type)等
二,flask結構化拆分。
當我們有大量的業務代碼的時候,就不能在一個index.py中書寫了,因為這樣臃腫且不易維護,而且都把代碼放在一個文件中也不符合python之禪的精神,所以呢,我們需要對結構化進行一個拆分。
一般情況下會拆分成以下結構:
test 工程目錄 app #應用層 config #配置目錄 __init__.py #初始化文件 secure.py #機密配置 setting.py #普通配置 libs #庫目錄 helper.py #幫助方法模塊 httper.py #網絡請求模塊 ... #其他模塊 models #模型目錄 __init__.py #初始化文件 model.py #模型文件
... #其他文件 web #藍圖1目錄 __init__.py #藍圖初始化文件 xxx.py #藍圖文件
... #其他文件 api #藍圖2目錄 __init__.py #藍圖初始化文件 xxx.py #藍圖文件
... #其他文件 cms #藍圖3目錄 __init__.py #藍圖初始化文件 xxx.py #藍圖文件
... #其他文件 static #靜態文件夾 css #css文件夾 js #js文件夾 img #圖片 font #字體
... #其他模塊 templates #模版文件夾 xxxx #業務目錄1 xxxx.html #業務模版 server.py 入口文件
那麽我們現在開始進行結構化拆分之旅吧
1. 增加config.py
2. 在server.py中引入config配置文件
啟動之後,debug調試模式開啟,端口號由默認的5000更改成8000了。這也就是說我們導入的配置文件有效。
3. 在工程目錄下創建一個user.py 文件
重新啟動後,調用瀏覽器 http://127.0.0.1:8000/user
為什麽會報404 Not Found 呢?是不是我們沒有在server文件中引入user.py呢?那我們在sever.py中引入user.py
瀏覽器訪問 http://127.0.0.1:8000/user
既然我在主文件中已經導入了user模塊,那為什麽還是不奏效呢? 這個就得從循環導入問題解決了,你覺得兩次的app是一樣的嗎?我們做一個實驗。
在server.py中 打印app的id, print(‘實例化的app‘,id(app))
在server.py中 main函數中打印 print(‘運行中的app‘,id(app))
在 user.py 中 打印 print(‘路由中的app‘,id(app))
運行之後:
事實說明flask實例化兩次,走路由的那次app最終沒有在main函數中執行,所以會報404錯誤。
第四章:FLASK結構拆分和循環引入問題