目錄
一、使用藍圖劃分專案目錄
1.藍圖的介紹
flask框架的目錄結構沒有很大的強制性,可以隨意根據自己的喜好來搭建專案目錄。也就是說flask框架的可塑造型非常強。當然有第三方模組來實現劃分目錄。當然其實可以不用藍圖也能劃分目錄。app物件在全域性在用,因此導來導去一定會出現迴圈匯入問題,因此使用藍圖來劃分目錄就可以解決該問題。以下三張圖是三種劃分目錄的效果圖,那麼接下來研究一下使用藍圖具體實現劃分目錄吧
- 不使用藍圖劃分專案目錄結構
- 使用藍圖劃分小型專案目錄結構
- 使用藍圖劃分大型專案目錄結構
2.藍圖的使用
第一步:在app包的雙下init.py檔案匯入藍圖類並得到例項化物件
from flask import Blueprint
admin_bp = Blueprint('admin', __name__, static_folder='static', template_folder='templates')
from . import views # 這個匯入語句不能放到最上面,只能藍圖例項化物件下面放
第二步:在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')
第三步:在不同的views.py 使用藍圖註冊路由
from flask import render_template
from . import admin_bp
@admin_bp.route('/home')
def home():
return render_template('Admin.html')
最後可以正常訪問路由,說明使用藍圖劃分目錄成功了
二、介紹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'
三、使用資料庫連線池連結資料庫
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)
最後使用資料庫連線池的方式查詢資料庫成功了