天天看點

【python-flask學習筆記】4 session和cookie1、Cookie和Session概念2、flask中使用cookie和session3、flask中的 session工作機制4、操作session

1、Cookie和Session概念

(1)cookie: 在網站中,http請求是無狀态的。也就是說即使第一次和伺服器連接配接後并且登入成功後,第二次請求伺服器依然不能知道目前請求是哪個使用者。

cookie

的出現就是為了解決這個問題,第一次登入後伺服器傳回一些資料(cookie)給浏覽器,然後浏覽器儲存在本地,當該使用者發送第二次請求的時候,就會自動的把上次請求存儲的

cookie

資料自動的攜帶給伺服器,伺服器通過浏覽器攜帶的資料就能判斷目前使用者是哪個了。cookie存儲的資料量有限,不同的浏覽器有不同的存儲大小,但一般不超過4KB。是以使用

cookie

隻能存儲一些小量的資料。

(2)session: session和cookie的作用有點類似,都是為了存儲使用者相關的資訊。不同的是,

cookie

是存儲在本地浏覽器,

session

是一個思路、一個概念、一個伺服器存儲授權資訊的解決方案,不同的伺服器,不同的架構,不同的語言有不同的實作。雖然實作不一樣,但是他們的目的都是伺服器為了友善存儲資料的。

session

的出現,是為了解決

cookie

存儲資料不安全的問題的。

session的好處:

  • 敏感資料不是直接發送回給浏覽器,而是發送回給一個

    session_id

    伺服器将

    session_id

    和敏感資料做一個映射存儲在

    session

    (在伺服器上面)中,更加安全。
  • session

    可以設定過期時間,也從另一方面保護了使用者的賬戶安全。

(3)cookie和session結合使用:

web

開發發展至今,

cookie

session

的使用已經出現了一些非常成熟的方案。在如今的市場或者企業裡,一般有兩種存儲方式:

  • 存儲在服務端:通過

    cookie

    存儲一個

    session_id

    ,然後具體的資料則是儲存在

    session

    中。如果使用者已經登入,則伺服器會在

    cookie

    中儲存一個

    session_id

    ,下次再次請求的時候,會把該

    session_id

    攜帶上來,伺服器根據

    session_id

    session

    庫中擷取使用者的

    session

    資料。就能知道該使用者到底是誰,以及之前儲存的一些狀态資訊。這種專業術語叫做

    server side session

    。存儲在伺服器的資料會更加的安全,不容易被竊取。但存儲在伺服器也有一定的弊端,就是會占用伺服器的資源,但現在伺服器已經發展至今,一些

    session

    資訊還是綽綽有餘的。
  • session

    資料加密,然後存儲在

    cookie

    中。這種專業術語叫做

    client side session

    。flask采用的就是這種方式,但是也可以替換成其他形式。

2、flask中使用cookie和session

(1)cookie: 在

Flask

中操作

cookie

,是通過

response

對象來操作,可以在

response

傳回之前,通過

response.set_cookie

來設定,這個方法有以下幾個參數需要注意:

  • key:設定的cookie的key。
  • value:key對應的value。
  • max_age:改cookie的過期時間,如果不設定,則浏覽器關閉後就會自動過期。
  • expires:過期時間,應該是一個

    datetime

    類型。
  • domain:該cookie在哪個域名中有效。一般設定子域名,比如

    cms.example.com

  • path:該cookie在哪個路徑下有效。

(2) session:

Flask

中的

session

是通過

from flask import session

。然後添加值

key

value

進去即可。并且,

Flask

中的

session

機制是将

session

資訊加密,然後存儲在

cookie

中。專業術語叫做

client side session

3、flask中的 session工作機制

  • flask中的

    session

    機制是:把敏感資料經加密後,放入

    session

    中,然後再把

    session

    存放到

    cookie

    中,下次請求的時候,再從浏覽器發送過來的

    cookie

    中讀取

    session

    ,然後在從

    session

    中讀取敏感資料,并進行解密,擷取最終的使用者資料。
  • flask的這種

    session

    機制可以節省伺服器的開銷,因為把所有的資訊都存儲到了用戶端(浏覽器)。
  • 安全是相對的,把

    session

    放到

    cookie

    中,經過加密,也是比較安全的,這點大家可以放心使用。

4、操作session

(1)session的操作方式:

  • 使用

    session

    需要從flask中導入

    session

    ,以後所有和

    session

    相關的操作都是通過這個變量來的。
  • 使用

    session

    需要設定

    SECRERT_KEY

    ,用來作為加密用的,而且這個

    SECRERT_KEY

    如果每次伺服器啟動後都變化的話,那麼之前的

    session

    就不能再通過目前這個

    SECRERT_KEY

    進行解密了。
  • 操作

    session

    的時候,跟操作字典是一樣的。
    • 添加

      session

      : :

      session['username'] = 'string'

    • 删除

      session

      session.pop('username')

      或者

      del session['username']

    • 清除所有

      session

      session.clear()

    • 擷取

      session

      session.get('username')

(2)設定

session

的過期時間

  • 如果沒有指定

    session

    的過期時間,那麼預設的就是浏覽器關閉後就自動結束
  • 如果設定了

    session

    permanent

    屬性為True,那麼過期時間就是預設的31天。
  • 自定義過期時間: 可通過個給app.config設定

    PERMANENT_SESSION_LIFETIME

    來更改過期時間,這個值的資料類型是

    datetime.timedelay

    類型。

示例:

# session_demo.py
from flask import Flask, session
import os  # 用于下面調用urandom(N)函數随機生成N個字元。
from datetime import timedelta

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)  # 24位字元
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(days=7)  # 如果設定了session.permanent=True,沒設定這個天數的話,預設的是31天。


@app.route('/')
def index():
    session['username'] = 'Aboil'
    session.permanent = True  # 該屬性預設的是false,為false時,預設的過期時間是浏覽器關閉後就自動結束。
    return 'Hello Python!'


@app.route('/get/')
def get():
    print(session.get('username'))  # 擷取session['username']的值
    return 'get success!'


@app.route('/delete/')
def delete():
    print(session.get('username'))  # 擷取session['username']的值
    session.pop('username')  # 删除session['username']
    print(session.get('username'))  # 此時會列印出None,因為前面被删除了
    return 'delete success!'

@app.route('/clear/')
def clear():
    print(session.get('username'))  # 擷取session['username']的值
    session.clear()  # 删除session中的所有資料
    print(session.get('username'))  # 此時會列印出None,因為前面被清空了
    return 'clear success!'

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

           

以上筆記整理自知了課堂黃勇老師講解的教學視訊《Flask架構入門到實戰開發》的第四章的内容,不足之處,望不吝賜教!