常見的請求方式
- GET : 頁面的默認請求方式,請求的數據是以明文的形式放在路由上面,以
?
開頭的鍵值對,中間以&
連接多個參數 - POST : 請求的數據隱藏發送的,安全係數高,通常用來向服務器提交數據
請求對象
Flask 中由全局對象 request
處理請求,需要使用 from flask import request
導入模塊
request 常用屬性
屬性名 | 描述 |
---|---|
args |
獲取 get 請求的參數 |
form |
獲取 post 請求的參數 |
method |
獲取請求的方式 GET or POST |
files |
獲取上傳的文件 |
cookirs |
獲取 cookie 信息 |
headers |
獲取請求頭 |
path |
獲取 / |
host |
獲取 ip:host |
host_url |
獲取 http://127.0.0.1:5000/ |
referrer |
請求的來源 |
配置請求
# 配置路由 支持 POST 及 GET 請求 (默認僅支持 GET 請求)
@app.route("/",methods=["POST","GET"])
def view():
# 如果請求方式爲 POST
if request.method == "POST":
# 獲取 POST 方式提交的參數
data = request.form
# 如果請求方式爲 GET
elif request.method == "GET":
# 獲取 GET 方式提交的參數
data = request.args
文件上傳
HTML 表單
<form action="/file_upload/" method="POST" enctype="multipart/form-data">
<input type="file" name="img">
<input type="submit" value="上傳">
</form>
Flask
@app.route("/file_upload/",methods=["POST"])
def file_upload():
# 獲取文件對象
file = request.files.get("img")
# 獲取文件名
file_name = file.filename
# 保存文件
file.save(f"./{file_name}")
會話
由於 HTTP 協議都是無狀態的,即當前請求和上一次請求沒有任何的聯繫,請求者的身份都是匿名的,這樣的訪問缺乏連續性,導致在一個 WEB 項目中沒有辦法表示用戶的身份,對於 WEB 有很大的制約,基於此出現了會話機制,即 Cookie 和 Session
Cookie
Cookie 是瀏覽器在請求的時候,由服務器下發,保存在用戶的客戶端(本地)的一段用於標識身份的小文本
Cookie的出現讓瀏覽器的訪問有了連續性,可以有身份的訪問,但是也帶來了很大的安全隱患,Cookie 很容易被盜用和篡改
(1) 設置 Cookie
在 Flask 中,cookie 設置在響應對象上,使用 make_response()
函數從視圖函數的返回值中獲取響應對象。之後,使用響應對象的 set_cookie()
函數老存儲 cookie
set_cookie(key, value[, max_age, expires, path, domain, secure, httponly])
參數 | 描述 |
---|---|
key | 設置的 cookie 中的 key |
value | 設置的 cookie 中的 value |
max_age | cookie的過期時間,值爲秒數 |
expires | cookie的過期時間,值爲 datetime對象 或 unix時間戳 |
path | 將 cookie 限制爲給定路徑生效,默認爲所有路徑 |
domain | cookie 生效的域名 |
secure | 如果爲 True,則 cookie 僅可通過 https 使用 |
httponly | 如果爲 True,則禁止 JavaScript 訪問 cookie |
from flask import make_response
@app.route("/")
def view():
resp = make_response(render_template("index.html"))
resp.set_cookie("username","zong")
return resp
(2) 獲取 Cookie
request.cookies.get("key")
(3) 刪除 Cookie
@app.route("/del_cookie/")
def del_cookie():
rep = make_response("刪除 cookie")
rep.delete_cookie("username")
return rep
通過觀察 Reponse Headers 可以發現,刪除 cookie 就是將 cookie 值 置爲空,並將過期時間設置爲 過去
Set-Cookie: username=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/
Session
與 Cookie 不同,session 數據存儲在服務器上,安全性有了提高。
session 爲每個客戶端的會話分配 會話ID,會話數據存儲在 cookie 的頂部,服務器以加密方式對其進行簽名。對於此加密,Flask程序需要定義一個 SECRET_KEY
特點:
- session 依賴 cookie 技術
- session本身存儲在服務器上邊,多數情況下存儲在數據庫中,頻繁校驗數據會導致服務器,數據庫的壓力變大
(1) 設置 Session
from flask import session
# 設置 session SECRET_KEY
app.config["SECRET_KEY"] = "test@0527"
# 添加 session
session['xxx'] = "xxx"
(2) 獲取 Session
session['xxx']
session.get('xxx')
(3) 刪除 Session
# 刪除指定 session
session.pop("xx")
# 清空 session
session.clear()
(4) 設置 session 過期時間
# 如果不設置過期時間,session默認爲 瀏覽器關閉後過期
# 默認過期時間爲 31 天
session.permanent = True
# 配置 app.config 修改默認過期時間
from datetime import timedelta
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)
session.permanent = True