Flask基本使用
阿新 • • 發佈:2020-08-14
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)