1. 程式人生 > 實用技巧 >Flask之藍圖

Flask之藍圖

一、什麼是藍圖

  藍圖的基本設想是它們記錄註冊到一個應用時的操作執行情況。 當從一個端點到另一端分發請求和生成 URL 時,Flask 關聯檢視函式和藍圖。也就是隨著我們開發程式越來越大,將程式碼進行模組化管理。我們之前可能是將所有程式碼都寫在一個py檔案,例如:

from flask import Flask

app = Flask(__name__)


@app.route('/home')
def home():
    return "home"


@app.route('/login')
def login():
    return "login"


if __name__
== '__main__': app.run()

  隨著功能越來越多,功能之間也需要進行區分,此時我們可以將同一功能的模組寫在一個py檔案,這樣可以將這一個py檔案當作一個藍圖,然後每一個藍圖註冊到app中就可以了。

二、簡單專案結構設計

I:.
│  run.py
│
├─.idea
│  │  encodings.xml
│  │  flaskPro.iml
│  │  misc.xml
│  │  modules.xml
│  │  workspace.xml
│  │
│  └─inspectionProfiles
│          Project_Default.xml
│
└─flaskPro
    │  
__init__.py │ ├─statics │ home.css │ ├─templates │ home.html │ login.html │ ├─views │ │ account.py │ │ blogs.py │ │ │ └─__pycache__ │ account.cpython-35.pyc │ blogs.cpython-35.pyc │ └─__pycache__
__init__.cpython-35.pyc

這是flask專案flaskPro下的樹形結構,可以看到主要是run.py檔案和flaskPro包。

1、run.py

這是整個專案的入口檔案,啟動專案就從這個檔案開始。

from flaskPro import app  #從flaskPro 包匯入app物件


if __name__ == '__main__':
    app.run()

2、flaskPro

run.py中的app物件就是從這個包匯入的,首先就是在這個包中的__init__.py檔案中:

from flask import Flask

# 將Flask進行例項化,傳入響應的引數,其中static_url_path是靜態檔案地址路徑
app = Flask(__name__,template_folder='templates',static_folder='statics',static_url_path='/static')

# 將所有的藍圖匯入進來,相當於彙總
from .views.account import account
from .views.blogs import blogs

# 將所有的藍圖再注入到app中,這樣進行同一,請求一旦進來,由app統一分發
app.register_blueprint(account) #不加字首 http://127.0.0.1:5000/login
app.register_blueprint(blogs,url_prefix='/blogs') #可以加入字首,http://127.0.0.1:5000/blogs/home

可以看到在這個檔案中主要做下面幾件事:

  • 例項化Flask物件app
  • 匯入所有的藍圖
  • 將藍圖注入到app物件

那麼,這個包中剩下的views、templates、statics目錄分別是藍圖檔案、模板檔案、靜態檔案。比如,views中的blogs藍圖檔案:

from flask import Blueprint
from flask import render_template
from flask import request


blogs = Blueprint('blogs',__name__)

@blogs.route('/home')
def home():
    return render_template('home.html')

templates檔案中home.html檔案:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="/static/home.css"  type="text/css" rel="stylesheet">
</head>
<body>
<h1>home</h1>
</body>
</html>

這就是通過藍圖設計一個簡單專案的結構。

三、複雜專案結構設計

I:.
│  run.py
│
├─.idea
│  │  encodings.xml
│  │  flaskPro2.iml
│  │  misc.xml
│  │  modules.xml
│  │  workspace.xml
│  │
│  └─inspectionProfiles
│          Project_Default.xml
│
└─flaskPro2
    │  __init__.py
    │
    ├─admin
    │  │  views.py
    │  │  __init__.py
    │  │
    │  ├─statics
    │  ├─templates
    │  └─__pycache__
    │          views.cpython-35.pyc
    │          __init__.cpython-35.pyc
    │
    ├─web
    │  │  views.py
    │  │  __init__.py
    │  │
    │  ├─statics
    │  ├─templates
    │  └─__pycache__
    │          views.cpython-35.pyc
    │          __init__.cpython-35.pyc
    │
    └─__pycache__
            __init__.cpython-35.pyc

這是flask專案flaskPro2下的樹形結構,可以看到主要是run.py檔案和flaskPro2包。

1、run.py

這是整個專案的入口檔案,啟動專案就從這個檔案開始。

from flaskPro2 import app  #從flaskPro2 包匯入app物件


if __name__ == '__main__':
    app.run()

2、flaskPro2

run.py中的app物件就是從這個包匯入的,首先就是在這個包中的__init__.py檔案中:

from flask import Flask
from .admin import admin
from .web import web


app = Flask(__name__)  #app物件

# 注入藍圖
app.register_blueprint(admin,url_prefix='/admin')
app.register_blueprint(web,url_prefix='/web')

注意的是這裡的每一個藍圖又相當於是每一個app一樣。比如web藍圖,在web包的__init__.py檔案中建立藍圖物件:

from flask import Blueprint


web = Blueprint(
    'web',
    __name__,
    template_folder='templates',
    static_url_path='static'
)  #每一個藍圖有自己獨立的模板資料夾和靜態資料夾

from . import views #這裡的views檔案是必須匯入的,否則不執行views中路由注入,會導致找不到web下的路由

在views.py檔案中:

from . import web

@web.route('/home')
def home():
    return 'home'

其餘的藍圖與這個是一樣的。