藍圖的作用是可以把一個應用拆分成多個文件勇吊,以便于大型應用的編寫集峦。
實現一個簡單的藍圖。
本例中每辟,文件目錄是這樣組織的:
/main.py # 主函數寫在這
/routes # 按功能拆分路由
/todo.py
/user.py
我們根據功能,把和 Todo 功能相關的路由函數寫到 todo.py
中干旧,把和 User 相關的路由函數寫到 user.py
中渠欺。
編寫 todo.py
:
from flask import (
render_template,
request,
redirect,
url_for,
Blueprint,
)
# 創(chuàng)建一個 藍圖對象 并且路由定義在藍圖對象中
# 然后在 flask 主代碼中「注冊藍圖」來使用
# 第一個參數是藍圖的名字, 第二個參數是套路
todo_routes = Blueprint('todo', __name__)
@todo_routes.route('/')
def index():
return 'Here is Todo!'
編寫 user.py
:
from flask import (
render_template,
request,
redirect,
url_for,
Blueprint,
)
# 創(chuàng)建一個 藍圖對象 并且路由定義在藍圖對象中
# 然后在 flask 主代碼中「注冊藍圖」來使用
# 第一個參數是藍圖的名字, 第二個參數是套路
user_routes = Blueprint('user', __name__)
@user_routes.route('/')
def index():
return 'Here is User!'
編寫 main.py
:
from flask import Flask
# 引入各個路由的藍圖對象
from routes.todo import todo_routes
from routes.user import user_routes
app = Flask(__name__)
# 設置 secret_key 來使用 flask 自帶的 session
# 這個字符串隨便你設置什么內容都可以
app.secret_key = 'random string'
# 注冊藍圖
# 有一個 url_prefix 可以用來給藍圖中的每個路由加一個前綴
# 比如:碰到 "/todo" 開頭的 URL,就會用 todo_routes 的函數來處理
app.register_blueprint(todo_routes, url_prefix='/todo')
app.register_blueprint(user_routes, url_prefix='/user')
# 運行代碼
if __name__ == '__main__':
# debug 模式可以自動加載你對代碼的變動, 所以不用重啟程序
# host 參數指定為 '0.0.0.0' 可以讓別的機器訪問你的代碼
config = dict(
debug=True,
host='0.0.0.0',
port=3000,
)
app.run(**config)
這時候椎眯,打開 "http://127.0.0.1:3000/todo/"挠将,“http://127.0.0.1:3000/user/”,就能見到藍圖工作了编整。
可能我們會對 Blueprint('user', __name__)
中第一個參數的作用有疑問舔稀,這類似于 Django URLs 中的 name
參數的作用。
上面例子中掌测,我們可以用 url_for('todo.index')
或者 url_for('user.index')
來找到對應方法的 URL内贮。
下面我們用藍圖來實現 Django 風格的文件目錄。
/main.py # 主函數寫在這
/todo_app
/__init__.py
/models.py
/views.py
/templates # 屬于 todo 的模板文件夾
/todo_index.html
/user_app
/__init__.py
/models.py
/views.py
/templates # 屬于 user 的模板文件夾
/user_index.html
編寫 todo_app/views.py
:
from flask import (
render_template,
request,
redirect,
url_for,
Blueprint,
)
# 創(chuàng)建一個 藍圖對象 并且路由定義在藍圖對象中
# 然后在 flask 主代碼中「注冊藍圖」來使用
# 第一個參數是藍圖的名字, 第二個參數是套路
todo_routes = Blueprint(
'todo',
__name__,
template_folder = 'templates', # 設定模板目錄
url_prefix='/todo' # 設定后綴 url
)
@todo_routes.route('/')
def index():
return render_template('todo_index.html')
編寫 user_app/views.py
:
from flask import (
render_template,
request,
redirect,
url_for,
Blueprint,
)
# 創(chuàng)建一個 藍圖對象 并且路由定義在藍圖對象中
# 然后在 flask 主代碼中「注冊藍圖」來使用
# 第一個參數是藍圖的名字, 第二個參數是套路
user_routes = Blueprint(
'user',
__name__,
template_folder = 'templates',
url_prefix='/user'
)
@user_routes.route('/')
def index():
return render_template('user_index.html')
編寫 main.py
:
from flask import Flask
# 引入各個路由的藍圖對象
from todo_app.views import todo_routes
from user_app.views import user_routes
app = Flask(__name__)
# 設置 secret_key 來使用 flask 自帶的 session
# 這個字符串隨便你設置什么內容都可以
app.secret_key = 'random string'
# 注冊藍圖
app.register_blueprint(todo_routes)
app.register_blueprint(user_routes)
# 運行代碼
if __name__ == '__main__':
config = dict(
debug=True,
host='0.0.0.0',
port=3000,
)
app.run(**config)