藍(lán)圖的使用
- 1.目錄結(jié)構(gòu):

app1: 單個應(yīng)用的目錄
app1/admin: app1下的一個功能模塊
app1/admin/templates: 存放實現(xiàn)admin功能的模板文件
app1/admin/urls.py: 類似Django的urls,設(shè)置路由(此處創(chuàng)建admin專屬的路由)
app1/admin/views.py: 模板渲染文件,類似Django的views
templates/index.html: 項目入口(或鏈接各個應(yīng)用)的模板文件
apps.py: 創(chuàng)建Flask-app對象;注冊藍(lán)圖,為藍(lán)圖添加前綴;啟動應(yīng)用
- 2.文件內(nèi)容
1.app1/admin/templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Admin</title>
</head>
<body>
<h1>Admin</h1>
</body>
</html>
2.app1/admin/views.py
- 渲染模板文件
from flask import render_template
def show_admin():
return render_template('index.html')
3.app1/admin/urls.py
- 注冊藍(lán)圖admin,指明模板文件,添加藍(lán)圖路由
from flask import Blueprint
from .views import *
admin = Blueprint('admin', __name__, template_folder='admin_templates')
admin.add_url_rule('/show_admin/', view_func=show_admin)
4.apps.py
- 創(chuàng)建Flask-app對象;注冊藍(lán)圖,為藍(lán)圖添加前綴;啟動應(yīng)用
from flask import Flask
app1 = Flask(__name__)
from app1.admin.urls import admin
app1.register_blueprint(admin, url_prefix='/admin')
if __name__ == '__main__':
app1.run(debug=True)
文件訪問
- 通過藍(lán)圖注冊的靜態(tài)文件及模板文件的訪問規(guī)則如下:
1.如果在項目目錄下存在靜態(tài)文件和模板文件,則優(yōu)先訪問

- manage_test/templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
<h1>首頁</h1>
</body>
</html>
- app1/admin/templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Admin</title>
</head>
<body>
<h1>Admin</h1>
</body>
</html>
- app1/admin/urls.py 創(chuàng)建藍(lán)圖對象admin,在manage_test/app.py中注冊
from flask import Blueprint
from .views import *
admin = Blueprint('admin', __name__,
static_folder='static',
template_folder='templates')
admin.add_url_rule('/show_index/',
view_func=show_admin)
- app1/admin/views.py 渲染網(wǎng)頁
from flask import render_template
def show_admin():
return render_template('index.html')
- manage_test/apps.py 創(chuàng)建app對象及注冊藍(lán)圖
from flask import Flask
app1 = Flask(__name__)
from app1.admin.urls import admin
app1.register_blueprint(admin, url_prefix='/admin')
if __name__ == '__main__':
app1.run(debug=True)
- 運(yùn)行apps.py,打開瀏覽器顯示結(jié)果如下

2.如果項目目錄下不存在靜態(tài)文件和模板文件,則優(yōu)先訪問最先注冊的藍(lán)圖目錄下的文件
-
1.刪除manage_test/templates/index.html
- 此時刷新網(wǎng)頁顯示結(jié)果如下:

-
2.創(chuàng)建grade文件夾,里面也創(chuàng)建一個templates文件夾及index.html文件
- app1/grade/views.py
from flask import render_template def show_index(): return render_template('index.html')- urls.py
from flask import Blueprint from .views import * grade = Blueprint('grade', __name__, static_folder='static', template_folder='templates') grade.add_url_rule('/show_index/', view_func=show_index)- manage_test/apps.py 新增一個藍(lán)圖grade的注冊
from flask import Flask app1 = Flask(__name__) from app1.admin.urls import admin from app1.grade.urls import grade app1.register_blueprint(grade, url_prefix='/grade') app1.register_blueprint(admin, url_prefix='/admin') if __name__ == '__main__': app1.run(debug=True)- 此時刷新網(wǎng)頁:
admin/show_index
grade/show_index
Tip:
- 使用flask藍(lán)圖設(shè)置路由時需要注意靜態(tài)文件和模板文件不能同名
推薦做法一: 在每個功能模塊下的靜態(tài)和模板文件夾下再創(chuàng)建一個與應(yīng)用同名的文件夾
- 修改admin/views.py
return render_template('admin/index.html')
此時admin/show_index顯示:
推薦做法二: 每個模塊在創(chuàng)建文件夾時加上模塊名
admin_templates
(當(dāng)然如果是小組開發(fā),也可以使用代號LZ_templates)
推薦做法三: 根據(jù)模板文件的功能命名,確保不會與其他模塊重名
issue
ValueError: urls must start with a leading slash
藍(lán)圖在注冊添加前綴時沒有加'/'


