藍圖,聽起來就是一個很宏偉的東西html
在Flask中的藍圖 blueprint 也是很是宏偉的web
它的做用就是將 功能 與 主服務 分開怎麼理解呢?flask
好比說,你有一個客戶管理系統,最開始的時候,只有一個查看客戶列表的功能,後來你又加入了一個添加客戶的功能(add_user)模塊, 而後又加入了一個刪除客戶的功能(del_user)模塊,而後又加入了一個修改客戶的功能(up_user)模塊,在這個系統中,就能夠將app
查看客戶,修改客戶,添加客戶,刪除客戶的四個功能作成藍圖加入到客戶管理系統中,本篇最後會作一個這樣的例子,可是首先咱們要搞清楚什麼是藍圖 blueprintide
1.初識Flask藍圖(blueprint)函數
建立一個項目而後將目錄結構作成:post
s_view.py 文件中的內容this
from flask import Blueprint # 導入 Flask 中的藍圖 Blueprint 模塊 sv = Blueprint("sv", __name__) # 實例化一個藍圖(Blueprint)對象 @sv.route("/svlist") # 這裏添加路由和視圖函數的時候與在Flask對象中添加是同樣的 def view_list(): return "svlist_view_list"
manager.py 文件中的內容spa
from flask import Flask # 導入此前寫好的藍圖模塊 from student_view import s_view app = Flask(__name__) # type:Flask # 在Flask對象中註冊藍圖模塊中的藍圖對象 s_view 中的 sv app.register_blueprint(s_view.sv) app.run("0.0.0.0",5000) # 如今Flask對象中並無寫任何的路由和視圖函數
開啓服務,而後訪問 http://127.0.0.1:5000/svlist 查看結果code
很明顯,咱們沒有在Flask對象中添加路由,可是咱們註冊了有路由和視圖函數的sv藍圖對象
2.如何理解藍圖呢?
其實咱們能夠理解成一個沒有run方法的Flask對象,這個理論雖然有不少的漏洞,可是對於剛接觸藍圖的你來講,就這麼樣理解,沒有錯
下面來看一下,在實例化藍圖的時候能夠傳遞的參數都有什麼,你就能徹底理解了
這是目錄結構
s_view.py 文件中的內容 :
from flask import Blueprint # 導入 Flask 中的藍圖 Blueprint 模塊 from flask import render_template sv = Blueprint("sv", __name__, template_folder="sv_template", # 每一個藍圖均可覺得本身獨立出一套template模板文件夾,若是不寫則共享項目目錄中的templates static_folder="sv_static" # 靜態文件目錄也是能夠獨立出來的 ) # 實例化一個藍圖(Blueprint)對象 @sv.route("/svlist") def view_list(): return render_template("svlist.html")
svlist.html 文件中的內容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> Hello ! I am sv_template <img src="/sv_static/DragonFire.png"> </body> </html>
打開頁面看結果
從這個例子中咱們總結出:
Blueprint 其實能夠理解爲一個了沒有run方法的 Flask 對象
只要Blueprint被 Flask 註冊了,就必定會生效
坑來了!坑來了!
藍圖內部的視圖函數及route不要出現重複,不然~大家本身試試吧
3.使用藍圖,作一個增刪改查用戶
要有一個文件存放咱們的原始數據
student_data.py 文件中的內容:
STUDENT = [ {'id': 1, 'name': 'Old', 'age': 38, 'gender': '中'}, {'id': 2, 'name': 'Boy', 'age': 73, 'gender': '男'}, {'id': 3, 'name': 'EDU', 'age': 84, 'gender': '女'} ]
而後咱們根據以上內容進行增刪改查
3.1 使用藍圖進行web應用搭建:
__init__.py 文件中的內容:
from flask import Flask def create_app(): app = Flask(__name__) return app
這個文件咱們會修改函數 create_app中的代碼
manager.py 文件中的內容
from student import create_app flask_app = create_app() flask_app.run("0.0.0.0",5000)
經過這種方式啓動 Flask 程序
3.2 使用Flask藍圖,查看學生信息
s_list.html 文件中的內容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>學生列表</title> </head> <body> <table border="3xp"> <thead> <tr> <td>ID</td> <td>name</td> <td>age</td> <td>gender</td> <td>options</td> </tr> </thead> <tbody> {% for foo in student %} <tr> <td>{{ foo.id }}</td> <td>{{ foo["name"] }}</td> <td>{{ foo.get("age") }}</td> <td>{{ foo.gender }}</td> <td> <a href="/s_update/{{ foo.id }}">修改</a> | <a href="/s_del?id={{ foo.id }}">刪除</a> </td> </tr> {% endfor %} </tbody> </table> <a href="/s_add"> 添加學生 </a> </body> </html>
stu_select.py 文件中的內容:
from flask import Blueprint from flask import render_template from student_data import STUDENT ss_blueprint = Blueprint("ss_b", __name__, template_folder="html", static_folder="static") @ss_blueprint.route("/s_list") def s_list(): return render_template("s_list.html", student=STUDENT)
student/__init__.py 文件中的內容:
from flask import Flask from student_select import stu_select def create_app(): app = Flask(__name__) # type:Flask app.register_blueprint(stu_select.ss_blueprint) return app
趕忙運行一下manager.py 來訪問一下,咱們的成果
什麼連接都不要點,由於點啥都很差使,以後我們一個一個的作
3.3. 使用Flask藍圖,添加一個學生
s_add.html 文件中的內容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>學生列表</title> </head> <body> <form method="post"> ID:<input type="text" name="id"> <br> 姓名:<input type="text" name="name"><br> 年齡:<input type="text" name="age"><br> 性別:<input type="text" name="gender"><br> <input type="submit" value="添加學生"> </form> </body> </html>
s_add.py中的內容
from flask import Blueprint from flask import redirect from flask import request from flask import render_template from student_data import STUDENT s_add = Blueprint("s_add", __name__, template_folder="html", static_folder="static") # type:Blueprint @s_add.route("/s_add",methods=["GET","POST"]) def s_add_view(): if request.method == "POST": stu_dic = { "id": request.form["id"], "name": request.form["name"], "age": request.form["age"], "gender": request.form["gender"] } STUDENT.append(stu_dic) return redirect("/s_list") return render_template("s_add.html")
這裏面咱們讓他添加完一個學生,就返回到s_list查看學生列表
student/__init__.py 文件中的內容
from flask import Flask from student_select import stu_select from student_add import stu_add def create_app(): app = Flask(__name__) # type:Flask app.register_blueprint(stu_select.ss_blueprint) app.register_blueprint(stu_add.s_add) return app
若是你要是從新啓動服務了,那麼你剛剛添加的學生信息就沒有了
添加完成以後
添加學生的Blueprint已經作完了
3.4. 使用Flask藍圖,修改學生信息
s_update.html 文件中的內容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>學生列表</title> </head> <body> <form method="post"> <input type="text" name="id" hidden value="{{ student.id }}"><br> 姓名:<input type="text" name="name" value="{{ student.name }}"><br> 年齡:<input type="text" name="age" value="{{ student.age }}"><br> 性別:<input type="text" name="gender" value="{{ student.gender }}"><br> <input type="submit" value="修改信息"> </form> </body> </html>
s_update.py 中的內容
from flask import Blueprint from flask import render_template from flask import redirect from flask import request from student_data import STUDENT s_update = Blueprint("s_update", __name__, template_folder="html", static_folder="static") @s_update.route("/s_update/<int:nid>",methods=["GET","POST"]) def s_update_view(nid): if request.method == "POST": stu_id = int(request.form["id"]) stu_dic = { "id": stu_id, "name": request.form["name"], "age": request.form["age"], "gender": request.form["gender"] } for index,stu in enumerate(STUDENT): if stu["id"] == stu_id: STUDENT[index] = stu_dic return redirect("/s_list") for stu in STUDENT: if stu["id"] == nid : return render_template("s_update.html", student=stu) return render_template("s_update.html", student="")
student/__init__.py
from flask import Flask from student_select import stu_select from student_add import stu_add from student_update import stu_update def create_app(): app = Flask(__name__) # type:Flask app.register_blueprint(stu_select.ss_blueprint) app.register_blueprint(stu_add.s_add) app.register_blueprint(stu_update.s_update) return app
試一下結果:
修改的功能也已經作完了,同窗們本身嘗試作一下刪除吧
4.藍圖目錄:
其實學會了藍圖,咱們的Flask項目目錄結構也就隨之出來了,那麼Flask的藍圖目錄結構應該是什麼樣子的呢?
如圖,這就是咱們創建好的一個目錄結構,一層一層的看一下,首先是app目錄,它就是咱們的主應用程序目錄了在這裏面有一個__init__.py這個文件裏面的內容以下
1 from flask import Flask 2 from .views.auto import auto_bp 3 from .views.motor import motor_bp 4 5 6 def create_app(): 7 my_app = Flask(__name__) # type:Flask 8 9 my_app.register_blueprint(auto_bp) 10 my_app.register_blueprint(motor_bp) 11 12 return my_app
由此見得__init__.py就是構建app的一個函數,而且將views中的彷佛是藍圖的東西註冊進去了
接下來看static目錄,這個目錄從字面意思就能夠理解了,就是咱們的static靜態文件存放目錄了
而後就是templates目錄,模板存放目錄
views目錄,主角終於登場了,這裏存放的就是視圖函數文件,也就是咱們Blueprint,每個文件就是一個Blueprint
from flask import Blueprint 2 3 auto_bp = Blueprint("auto",__name__) 4 5 @auto_bp.route("/auto") 6 def auto_func(): 7 return "my_app.auto"
1 from flask import Blueprint 2 3 motor_bp = Blueprint("motor",__name__) 4 5 @motor_bp.route("/motor") 6 def motor_func(): 7 return "my_app.motor"
這樣目錄結構就完成了,接下來就是關鍵性的一個文件manager.py項目的啓動文件
from app import create_app 2 my_app = create_app() 3 4 if __name__ == '__main__': 5 my_app.run()
以上就是咱們Flask小型應用的項目結構目錄了,要牢記哦
第九篇,完結