1. 程式人生 > >Flask - 藍圖和子域名

Flask - 藍圖和子域名

XA 相對 print IV span 文件 lin 0.0.0.0 pre

藍圖:

之前我們寫的 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 - 藍圖和子域名