11、Flask實戰第11天:視圖使用裝飾器
藍圖的基本使用
之前我們寫的代碼都是集中在一個主程序文件裏面。這樣不利於分層解耦和維護。
藍圖的作用就是讓我們的flask項目更加模塊化結構更加清晰,可以將相同模塊的視圖函數放在同一個藍圖下,同一個文件中,方便管理
比如,設計的網站有如下幾個模塊
讀書 ---book
電影 ---movie
新聞 ---news
用戶 ---user
我們新建了一個Python Package命名為blueprints,然後在裏面新建book.py, movie.py, news.py, user.py
這裏以user.py為例演示,其他模塊同理
from flask importBlueprint #我們發現這裏和主程序那裏差不多,只是這裏多了一個參數來表示該藍圖的名字 user_bp = Blueprint(‘user‘, __name__) @user_bp.route(‘/profile/‘) def profile(): return ‘個人中心‘ @user_bp.route(‘/settings/‘) def settings(): return ‘用戶設置‘
user.py的藍圖配置好了,我們需要到主程序my_flask.py那裏註冊才可以
... from blueprints.user importuser_bp ... app.register_blueprint(user_bp)
我們註意到訪問的url是: http://127.0.0.1:5000/profile/ 和http://127.0.0.1:5000/settings/
如果我們想在url加上前綴,變成http://127.0.0.1:5000/user/profile這種,我們只需要在配置藍圖的時候加上url_prefix參數
user_bp = Blueprint(‘user‘, __name__, url_prefix=‘/user‘)
模板文件尋找規則
在實際開發中我們使用藍圖也是渲染模板
@user_bp.route(‘/profile/‘) def profile(): return render_template(‘profile.html‘) #這個profile.html的位置也會從templates目錄裏面去找
我們也可以把模板放到其他位置,比如,我在blueprint下創建個目錄user,然後把模板profile.html當到user目錄下,那麽就需要使用template_folder參數
#這裏指定了這個藍圖模板的查找路徑,是相對於本藍圖的所在的路徑,也可以使用絕對路徑 user_bp = Blueprint(‘user‘, __name__, url_prefix=‘/user‘, template_folder=‘user‘) @user_bp.route(‘/profile/‘) def profile(): return render_template(‘profile.html‘)
一旦我們添加了template_folder參數,查找模板文件還是會先去templates查找,如果templates裏面沒有,才會去我們自己定義的目錄去找
靜態文件尋找規則
我們之前知道加載靜態文件是用: url_for(‘static‘, filename=‘xxxxx‘), 這種情況下,flask會直接從項目下面的static目錄去查找。在藍圖中也是這樣。
那麽我們也可以在藍圖中把靜態目錄位置改到其他地方,如:添加個static_folder參數
user_bp = Blueprint(‘user‘, __name__, url_prefix=‘/user‘, static_folder=‘xxxxx‘)
然後我們在模板中加載的時候需要指定藍圖的名字
url_for(‘user.static‘, filename=‘....‘)
其實在實際開發過程中我們沒必要改變模板和靜態文件的位置,使用默認指定的就可以了,這裏只是作為知識點講解
在沒有使用藍圖的時候,我們使用url_for反轉的時候,直接指定endpoint就可以了,但是有了藍圖之後,我們還必須加上藍圖的名字,比如:
url_for(‘user.profile‘)
11、Flask實戰第11天:視圖使用裝飾器