Flask - 藍圖和子域名
藍圖:
之前我們寫的 url 和視圖函數都是在同一個文件,如果項目比較大的話,這顯然不是一個合理的結構,而藍圖可以優雅的幫我們實現這個需求。例如:
from flask import Blueprint bp = Blueprint(‘user‘, __name__, url_prefix=‘/user/‘) @bp.route(‘/‘) def index(): return u"用戶首頁" @bp.route(‘/profile/‘): def profile(): return u"個人簡介"
然後我們在主程序中,通過app.register_blueprint()方法將這個藍圖註冊進url映射中,看下主app的實現:
from flask import Flask import user app = Flask(__name__) app.register_blueprint(user.bp) if __name__ == ‘__main__‘: app.run(host=‘0.0.0.0‘, port=5000)
以後訪問/user/,/user/profile/,都是執行user.py文件中的視圖函數,這樣就實現了項目的模塊化。
以上就是對藍圖的一個簡單介紹,但是使用藍圖還有幾個需要註意的地方,就是藍圖如何尋找靜態文件、模塊文件、ulr_for函數如何反轉url。以下進行介紹:
尋找靜態文件:
默認不設置如何靜態文件路徑,Jinja2會在項目的static文件夾中尋找靜態文件。也可以設置其他路徑,在初始化藍圖的時候,Blueprint這個構造函數,有一個參數static_folder可以指定靜態文件的路徑,如:
bp = Blueprint(‘admin‘, __name__, url_prefix=‘/admin‘, static_folder=‘static‘)
static_folder 可以是相對路徑(相對藍圖文件所在目錄),也可以是絕對路徑。在配置完藍圖後,還有一個需要註意的地方是如何在模板中引用靜態文件。在模板中引用藍圖,應該要使用藍圖名+ . + static來引用,如:
<link href="{ url_for(‘admin.static‘, filename=‘about.css‘)}">
尋找模板文件:
跟靜態文件一樣,默認不設置任何模板文件的路徑,將會在項目的templates中尋找模板文件。也可以設置其他的路徑,在構造函數Blueprint中有一個template_folder參數可以設置模板路徑,如:
bp = Blueprint(‘admin‘, __name__, url_prefix=‘/admin‘, template_folder=‘templates‘)
模板文件和靜態文件有點區別,以上代碼寫完以後,如果你渲染一個模板 return render_template(‘admin.html‘) , Flask 默認會去項目根目錄下的templates文件夾中查找admin.html文件,如果沒有找到,才會去藍圖文件所在的目錄下的templates文件夾中尋找:
url_for 生成 url:
用url_for生成藍圖的url,使用的格式是:藍圖名稱+ . +視圖函數名稱。比如要獲取 admin 這個藍圖下的 index 視圖函數的 url ,應該采用以下方式:
url_for(‘admin.index‘)
其中這個藍圖名稱是在創建藍圖的時候,傳入的第一個參數。bp = Blueprint(‘admin‘, __name__, url_prefix=‘/admin‘, template_folder=‘templates‘)
子域名:
子域名在許多網站中都用到了,比如一個網站叫做 xxx.com ,那麽我們可以定義一個子域名cms.xxx.com 來作為cms管理系統的網址, 子域名的實現一般也是通過藍圖來實現的。在之前的章節中,我們創建藍圖的時候添加一個url_prefix=/user作為url前綴,那樣我們就可以通過/user/來訪問user下的url。但使用子域名則不需要。另外,還需要配置SEVER_NAME, 比如app.config[SERVER_NAME] = ‘example.com:5000‘。並且在註冊藍圖的時候,還需要添加一個subdomain的參數,這個參數就是子域名的名稱,先來看一下藍圖的實現(admin.py):
from flask import Blueprint bp = Blueprint(‘admin‘, __name__, subdomain=‘admin‘) @bp.route(‘/‘) def admin(): return ‘Admin Page‘
這個沒有多大區別,接下來看主app的實現:
from flask import Flask import admin # 配置`SERVER_NAME` app.config[‘SERVER_NAME‘] = ‘example.com:5000‘ # 註冊藍圖,指定了subdomain app.register_blueprint(admin.bp) if __name__ == ‘__main__‘: app.run(host=‘0.0.0.0‘, port=5000, debug=True)
修改本地的host文件
訪問example.com:5000就可以訪問了
Flask - 藍圖和子域名