Flask自學筆記(2):Flask的鉤子函數與MySQL互動

Flask的鉤子(Hook)函數

  1. before_first_request:第一次請求才被調用(可用於緩存)
  2. before_request:請求之前被調用
  3. after_request:請求之後被調用(前面出錯就不會執行)
  4. teardown_request:無論報不報錯都會執行
from flask import Flask  
app = Flask(__name__)  

# 鉤子函數  
@app.before_request  
def before():  
    print('before request!')  
 
@app.before_request  
def before():  
    print('before request!2')  
  
# 第一次調用時才會被執行  
@app.before_first_request  
def before():  
    print('before first!!!')  
 
@app.route('/index/')  
def index():  
    # 1/0  # 如果取消這裡的注釋after_request就不會執行了  
    return 'index'  

# 程式在不出異常才會被調用  
@app.after_request  
def after(response):  
    print('after request')  
    return response  
 
@app.after_request  
def after(response):  
    print('after request2')  
    return response  
 
@app.teardown_request  
def teardown(exception):  
    print('teardown request')  
  
if __name__ == '__main__':  
    app.run()    

第一次執行

before first!!!
before request!
before request!2
after request2
after request
teardown request

第二次執行

before request!
before request!2
after request2
after request
teardown request

使用pymysql連接mysql資料庫

import pymysql.cursors

# Connect to the database
connection = pymysql.connect(host='localhost',
                             user='user',
                             password='passwd',
                             db='db',
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

try:
    with connection.cursor() as cursor:
        # Create a new record
        sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
        cursor.execute(sql, ('[email protected]', 'very-secret'))

    # connection is not autocommit by default. So you must commit to save
    # your changes.
    connection.commit()

    with connection.cursor() as cursor:
        # Read a single record
        sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
        cursor.execute(sql, ('[email protected]',))
        result = cursor.fetchone()
        print(result)
finally:
    connection.close()
import pymysql
from flask import Flask, request, g

app = Flask(__name__)

@app.before_request
def before():
    # 連接資料庫
    conn = pymysql.connect(host='IP位址', 
                                            port=埠 預設為3306, 
                                            user='root', 
                                            password='資料庫密碼', 
                                            database='資料庫名稱')
    # 獲取游標
    cursor = conn.cursor()
    # g物件,這是一個全域的命名空間
    g.conn = conn
    g.cursor = cursor

@app.route('/sel_stu’, methods=['GET'])
def sel_stu():
    if request.method == 'GET':
        # 查詢所有學生資訊
        sql = 'select * from student'
        g.cursor.execute(sql)
        data = g.cursor.fetchall()
        print(data)
        return '查詢成功'


@app.teardown_request
def teardown(exception):
    # 關閉連線資源
    g.conn.close()

if __name__ == '__main__':
    app.run(debug=True)