Flask - Flask的藍圖(BluePrint)

Flask - Flask的藍圖(BluePrint)

百度說藍圖這個詞有兩個意思:web

1.一般用鐵氰化和鐵鹽敏化的紙或布,曝光後用清水沖洗顯影曬成的藍底白圖的相紙,特別供曬印地圖、機械圖、建築圖樣用。flask

2.一個詳細的、各部分徹底協調的計劃或行動規劃。app

可是跟Flask的藍圖沒有一毛關係~函數

它的做用就是將 功能 與 主服務 分開怎麼理解呢?post

好比說,你有一個客戶管理系統,最開始的時候,只有一個查看客戶列表的功能,後來你又加入了一個添加客戶的功能(add_user)模塊, 而後又加入了一個刪除客戶的功能(del_user)模塊,而後又加入了一個修改客戶的功能(up_user)模塊,在這個系統中,就能夠將3d

查看客戶,修改客戶,添加客戶,刪除客戶的四個功能作成藍圖加入到客戶管理系統中,本篇最後會作一個這樣的例子,可是首先咱們要搞清楚什麼是藍圖 blueprintcode

一. 初始Flask藍圖

建立一個項目而後將目錄結構作成:
orm

s_view.py 文件中的內容htm

from flask import Blueprint  # 導入 Flask 中的藍圖 Blueprint 模塊

sv = Blueprint("sv", __name__)  # 實例化一個藍圖(Blueprint)對象


@sv.route("/svlist")  # 這裏添加路由和視圖函數的時候與在Flask對象中添加是同樣的
def view_list():
    return "svlist_view_list"

manager.py 文件中的內容

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 查看結果

很明顯,咱們沒有在Flask對象中添加路由,可是咱們註冊了有路由和視圖函數的sv藍圖對象

進階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>

訪問 127.0.0.1:5000/svlist 便可顯示頁面.

注意:藍圖內部的視圖函數及route不要出現重複

使用藍圖作一個增刪改查

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 程序

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. 使用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>

stu_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

若是你要是從新啓動服務了,那麼你剛剛添加的學生信息就沒有了

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>

stu_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

試一下結果:

刪除本身作吧..

5. 藍圖目錄

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

views/auto.py

1 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"

views/motor.py

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"

mnager.py

1 from app import create_app
2 my_app = create_app()
3 
4 if __name__ == '__main__':
5     my_app.run()
相關文章
相關標籤/搜索