1. 程式人生 > 實用技巧 >Flask基本使用

Flask基本使用

1.Flask路由

1.1 定義路由 

from flask import Flask

app = Flask(__name__)

# 1.路由對應的URL必須以/開頭
# 2.通過app的url_map屬性獲取所有的路由規則 (URL資源段 支援的請求方式 檢視函式標記)
# 3.可以通過route方法的methods引數指定路由支援的請求方式
@app.route('/hello', methods=['post', 'get'])
def index():
    return "index"


if __name__ == '__main__':
    print(app.url_map
)
# 獲取路由資訊 # for rule in app.url_map.iter_rules(): # print(rule.rule, rule.methods, rule.endpoint) app.run(debug=True)

1.2 路由變數:傳遞URL路徑引數, 實現動態URL

from flask import Flask

app = Flask(__name__)

# 路由變數: 傳遞URL路徑引數
# 格式: /user/<路由變數名>
@app.route('/user/<userid>')
def index(userid):  #
必須定義同名形參接收路由變數的值 print(userid) return "index" if __name__ == '__main__': app.run(debug=True)

1.3 路由轉換器:對URL傳遞的引數進行格式校驗, 類似Django設定URL時的正則表示式引數

from flask import Flask

app = Flask(__name__)

# 路由轉換器: 對路由變數進行格式校驗  條件不滿足返回404
# 格式: /user/<路由轉換器名:路由變數>
@app.route('/user/<int:userid>
') # int: 內建轉換器, 要求1-n個整數 def index(userid): print(userid) return "index" if __name__ == '__main__': app.run(debug=True)

1.4 自定義轉換器:開發者還可以自定義轉換器, 更加靈活的校驗路由變數

# 自定義轉換器:
# 1.定義轉換器類, 繼承BaseConverter
# 2.設定regex屬性 (正則匹配規則)
# 3.新增自定義轉換器

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 1.定義轉換器類:繼承自BaseConverter
class MobileConverter(BaseConverter):
    # 2.設定regex屬性(匹配規則)
    regex = '1[3-9]\d{9}$'  # 不要設定開頭的^


# 3.新增自定義轉換器: 往app,url_map.cpnverters新增轉換器
app.url_map.converters['mob'] = MobileConverter


@app.route('/user/<mob:mobile>')
def index(mobile):
    print(mobile)
    return "index"


if __name__ == '__main__':
    # 獲取所有的轉換器 {轉換器名: 轉換器類}
    # print(app.url_map.converters)
    app.run(debug=True)

2. Flask請求:flask的請求資料通過request物件來獲取

  

from flask import Flask, request
from werkzeug.datastructures import FileStorage

app = Flask(__name__)


@app.route('/', methods=['get', 'post'])
def index():
    # 獲取請求的基礎資料
    # print(request.url)  # 請求的URL
    # print(request.method)  # 本次請求的請求方式
    # print(request.headers)  # 獲取請求頭資訊  類字典物件

    # print(request.headers['Host'])
    # print(request.headers.get('Host'))  # 建議使用get方法, 鍵不存在不報錯

    # 請求傳遞資料 1> URL路徑 -> 路由變數  2> 查詢字串 get  3> 請求體  post  4> 請求頭 -> request.headers

    # 獲取查詢字串 -> request.args  xx?name=zs&age=20  類字典物件
    # print(request.args.get('name'))
    # print(request.args.get('age'))

    # 請求體:   鍵值對(表單)   文字(json/xml)  檔案(圖片/音訊)

    # 獲取post鍵值對 -> request.form  類字典物件
    # print(request.form.get('username'))

    # 獲取post文字資料 -> request.data / request.json
    # print(request.data)  # 返回bytes型別
    # print(request.json.get('age'))  # request.json直接將json字串轉為字典

    # 獲取post檔案 -> request.files  類字典物件
    file = request.files.get("avatar")  # type: FileStorage
    # print(type(file))  # 返回 FileStorage檔案物件
    # 將檔案儲存到本地
    file.save('123.jpg')

    # 獲取檔案的二進位制資料
    # img_bytes = file.read()
    # print(img_bytes)

    return "index"


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

3. Flask響應

3.1 訪問靜態資源

設定步驟:

① 將靜態資源放入到 專案的 static 資料夾中
② 通過內建的靜態資源的訪問路由, URL路徑格式為 /static/<filename>
        如 static目錄放入檔案 123.jpg, 則訪問URL為 http://127.0.0.1:5000/static/123.jpg

Flask物件的初始化引數 也可以 修改靜態資源的儲存和訪問路徑

from flask import Flask

app = Flask(__name__,  # 匯入名稱, flask會根據該引數查詢靜態檔案的儲存路徑
            # 官方建議直接使用__name__, 表示從當前目錄中查詢靜態檔案儲存路徑
            static_folder="static1",  # 設定靜態檔案的儲存目錄
            static_url_path='/res/img',  # 設定靜態檔案的URL訪問路徑 如 127.0.0.1:5000/res/img/123.jpg
            )


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

3.2 設定響應資料:

Flask中設定響應資料主要有兩種方式:
    設定多個返回值
    自定義響應物件

3.2.1 三個返回值:Flask中檢視函式的返回值可以設定三個, 分別對應響應體, 響應狀態碼, 響應頭

from flask import Flask, redirect, url_for

app = Flask(__name__)


@app.route('/demo1')
def demo1():
    # 返回值:  響應體, 響應狀態碼, 響應頭
    return 'demo1', 400, {'A': 40}

3.2.2 自定義響應物件:檢視函式返回的str / bytes型別資料會被包裝為Response響應物件, 也可以 建立響應物件來自定義響應頭等資訊

# 自定義響應物件
@app.route('/demo2')
def demo2():
    # 檢視函式的返回值可以為str/bytes型別, 並且flask內部會將其包裝為Response響應物件
    # return 'hello flask'

    # 建立響應物件     設定響應頭時,需要手動建立響應物件
    response = make_response('hello flask')  # type: Response ==>指定了response的型別從而使headers能被點出來
    # 設定響應頭
    response.headers['B'] = 10
    return response


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

3.3 返回Json:

  不推薦使用json.dumps()直接返回,返回的資料要符合 HTTP 協議規範,JSON需要指定content-type:application/json

  介面需要返回JSON資料,在 Flask 中可以直接使用jsonify()生成一個 JSON 的響應

from flask import Flask, make_response, Response, jsonify

app = Flask(__name__)


@app.route('/demo3')
def demo3():

    dict1 = {'name': 'zs', 'age': 20}
    # 字典轉json字串
    # return json.dumps(dict1)

    # 可以將字典轉json字串, 並且設定響應頭的content-type為application/json
    # return jsonify(dict1)
    return jsonify(name='zs', age=20)  # 也支援關鍵字實參的形式


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

3.4 重定向:flask中通過redirect()實現重定向功能

from flask import Flask, redirect

app = Flask(__name__)


@app.route('/demo3')
def demo3():

    return jsonify(name='zs', age=20)  


@app.route('/demo4')
def demo4():
    # 重定向到指定網站
    # return redirect('http://www.baidu.com')
    # 重定向到自己的路由   只需要URL資源段
    return redirect('/demo3')


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

4 狀態保持: Cookie 和 Session

4.1 Cookie

特點:
    將資料儲存在 客戶端 (使用者的電腦上), 可以減輕伺服器壓力
    訪問網站時, 瀏覽器會 自動 將該網站的cookie資料傳送給伺服器
使用場景:
    儲存一些 不太重要的資料 

程式碼示例:

from flask import Flask, make_response, Response, request

app = Flask(__name__)


@app.route('/')
def index():
    # 後端設定cookie:  通過響應體的set_cookie欄位

    # 建立響應物件
    response = make_response('index')  # type: Response

    # 設定響應頭的set_cookie欄位  value必須是str/bytes型別
    response.set_cookie('per_page', '10', max_age=86400)

    # 刪除cookie   本質: 設定max-age=0
    # response.delete_cookie('per_page')

    # 返回響應物件
    return response

@app.route('/demo1')
def demo1():
    # 獲取cookie:  瀏覽器會自動通過請求頭的cookie欄位來傳遞cookie資料

    # request.cookies 直接獲取到字典形式的cookie資料
    print(request.cookies.get('per_page'))

    return 'demo1'


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

4.2 Session

特點:
    將資料儲存在 服務端 (伺服器的資料庫中), 安全性更高
使用場景:
    儲存一些 重要/敏感的資料

程式碼示例:

from datetime import timedelta
from flask import Flask, session

app = Flask(__name__)
# 設定應用祕鑰   會被用於session簽名
app.secret_key = 'test'
# 設定session過期時間   預設31天
app.permanent_session_lifetime = timedelta(days=14)


@app.route('/')
def index():
    # session是一個類字典物件, 對其取值/賦值 就可以實現session資料的讀寫

    # 記錄session資料
    session['username'] = 'zs'

    # 設定session支援過期時間
    session.permanent = True

    # 刪除session資料
    # session.pop('username')

    return "index"


@app.route('/demo1')
def demo1():

    # 獲取session資料
    name = session.get('username')
    print(name)
    return 'demo1'

5. 異常處理:flask對HTTP錯誤進行了封裝, 可以捕獲http錯誤, 也可以主動丟擲http錯誤

from flask import Flask, abort
# flask對http錯誤進行了封裝, 可以捕獲http錯誤也可以主動丟擲http錯誤

app = Flask(__name__)

# 捕獲http錯誤
@app.errorhandler(404)
def error_404(error):  # 一旦進行捕獲, 要求必須定義形參接收具體錯誤資訊
    return "<h3>您訪問的頁面去浪跡天涯了</h3> %s" % error


# 還可以捕獲系統內建錯誤
@app.errorhandler(ZeroDivisionError)
def error_zero(error):
    return '除數不能為0'


@app.route('/')
def index():
    # a = 1 / 0

    abort(500)  # 主動丟擲異常 (只能丟擲http錯誤)
    return "index"


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