Flask框架使用藍圖劃分目錄、g物件、使用資料庫連線池連結資料庫

阿麗米熱發表於2023-04-04

一、使用藍圖劃分專案目錄

1.藍圖的介紹

flask框架的目錄結構沒有很大的強制性,可以隨意根據自己的喜好來搭建專案目錄。也就是說flask框架的可塑造型非常強。當然有第三方模組來實現劃分目錄。當然其實可以不用藍圖也能劃分目錄。app物件在全域性在用,因此導來導去一定會出現迴圈匯入問題,因此使用藍圖來劃分目錄就可以解決該問題。以下三張圖是三種劃分目錄的效果圖,那麼接下來研究一下使用藍圖具體實現劃分目錄吧

  1. 不使用藍圖劃分專案目錄結構
    image
  2. 使用藍圖劃分小型專案目錄結構
    image
  3. 使用藍圖劃分大型專案目錄結構
    image

2.藍圖的使用

第一步:在app包的雙下init.py檔案匯入藍圖類並得到例項化物件

from flask import Blueprint

admin_bp = Blueprint('admin', __name__, static_folder='static', template_folder='templates')
from . import views  # 這個匯入語句不能放到最上面,只能藍圖例項化物件下面放

image

第二步:在src跟目錄的雙下init.py檔案裡面註冊藍圖

from flask import Flask
from .admin import admin_bp

app = Flask(__name__)
app.config.from_pyfile('settings.py')

app.register_blueprint(admin_bp, url_prefix='/admin')

image

第三步:在不同的views.py 使用藍圖註冊路由

from flask import render_template
from . import admin_bp


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

image
最後可以正常訪問路由,說明使用藍圖劃分目錄成功了
image

二、介紹flask框架的g物件

1. g物件是什麼?

global的縮寫,在python中是個關鍵字,不能以關鍵字作為變數名,乾脆用了g;g物件,在整個請求的全域性,可以放值,可以取值全域性變數,在任意位置匯入使用即可。

  • 那麼它為什麼不學django使用request作為上下文?
    因為使用request,可能會造成request資料的汙染,不小心改了request的屬性,但你不知道建議使用g 是空的,放入之後在當次請求中全域性優先,以後想在當次請求中,放入一些資料,後面使用,就可以使用g物件。
  • g和session有什麼區別?
    g 是隻針對於當次請求
    session針對於多次請求

2. 使用程式碼再次解釋g物件

from flask import g
from . import home_bp


def add(a, b):
    print('---', g.name)
    return a + b


@home_bp.route('/use_g')
def use_g():
    g.name = 'lll'
    res = add(1, 2)
    print(res)
    return '魔鬼變數g'

image
image

三、使用資料庫連線池連結資料庫

1. 引入資料庫連線池的概念

flask操作mysql使用pymysql,在檢視函式中建立pymysql的連線,查資料,查完,返回給前端有什麼問題? 來一個請求,建立一個連線,請求結束,連線關閉(djanog就是這麼做的)把連線物件,做成全域性的,在檢視函式中,使用全域性的連線,查詢,返回給前端有什麼問題?會出現資料錯亂。解決上面的兩個問題,資料庫連線池、建立一個全域性的池、每次進入檢視函式,從池中取一個連線使用,使用完放回到池中,只要控制池的大小,就能控制mysql連線數。

2. 在flask框架中使用資料庫連線池的步驟

第一步:安裝第三方模組

pip install dbutils

第二步:例項化得到一個池物件

from dbutils.pooled_db import PooledDB
import pymysql

pool = PooledDB(
    creator=pymysql,
    maxconnections=10,
    mincached=2,
    maxcached=5,
    maxshared=3,
    blocking=True,
    maxusage=None,
    setsession=[],
    ping=0,
    host='127.0.0.1',
    port=3306,
    user='luffy',
    password='Luffy123?',
    database='luffy',
    charset='utf8'
)

第三步:在檢視函式中匯入使用

import pymysql
from flask import jsonify
from . import user_bp
from . import POOL


@user_bp.route('/list')
def list_info():
    conn = POOL.pool.connection()
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    cursor.execute('SELECT orders,title,image,link,info FROM luffy_banner')
    res = cursor.fetchall()
    return jsonify(res)

最後使用資料庫連線池的方式查詢資料庫成功了
image

相關文章