Web框架 Flask 之 請求方式 & 會話

常見的請求方式

  • 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

特點:

  1. session 依賴 cookie 技術
  2. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章