1. 程式人生 > >Flask Cookie和Session

Flask Cookie和Session

1.1.概念

cookie:在網站中,http請求是無狀態的。也就是說即使第一次和伺服器連線後並且登入成功後,第二次請求伺服器依然不能知道當前請求是哪個使用者。cookie的出現就是為了解決這個問題,第一次登入後伺服器返回一些資料(cookie)給瀏覽器,然後瀏覽器儲存在本地,當該使用者傳送第二次請求的時候,就會把上次請求儲存的cookie資料自動的攜帶給伺服器,伺服器通過瀏覽器攜帶的資料就能判斷當前是哪個使用者了。cookie儲存的資料量有限,不同的瀏覽器有不同的儲存大小,但一般不超過4kb。因此使用cookie只能儲存一些小量的資料。

session

:session和cookie的作用有點類似,都是為了儲存使用者相關的資訊。不同的是,cookie是儲存在本地瀏覽器,而session儲存在伺服器。儲存在伺服器的資料會更加安全,不容易被竊取。但儲存在伺服器也有一定的弊端,就是會佔用伺服器的資源,但現在伺服器已經發展至今,儲存一些session資訊還是綽綽有餘的。

cookie和session結合使用:cookie和session的使用已經出現了一些非常成熟的方案。一般有兩種儲存方式

  • 儲存在服務端:通過cookie儲存一個session_id,然後具體的資料則儲存在session中。如果使用者已經登入,則伺服器會在cookie中儲存一個session_id,下次再請求的時候,會把該session_id攜帶上,伺服器根據session_id在sesson庫中獲取使用者的session資料。就能知道該使用者到底是誰,以及之前儲存的一些狀態資訊。這種專業術語叫做 server side session.
  • 將session資料加密,然後儲存在cookie中。這種專業術語叫做 client side session。flask採用的就是這種方式,但是也可以替換成其它方式。

1.2.設定cookie

設定cookie:應該在Response的物件上設定。flask.Response物件上有一個set_cookie方法,可以通過這個方法來設定cookie資訊。

 
from flask import Flask,request,Response

app = Flask(__name__
) @app.route('/') def hello_world(): resp = Response("伺服器返回資訊") #設定cookie, resp.set_cookie('username','derek') return resp if __name__ == '__main__': app.run()
複製程式碼

引數介紹:原始碼

 def set_cookie(self, key, value='', max_age=None, expires=None,
                   path='/', domain=None, secure=False, httponly=False,
                   samesite=None):
  • key:鍵
  • value:值
  • max_age:設定過期時間(秒)
  • expires:設定過期時間,時間戳的形式(1970離現在的時間)
  • path:當前主域名
  • domain:子域名

1.3.刪除cookie

刪除cookie,通過Response.delete_cookie方法,指定cookie的key,就可以刪除cookie了

 
@app.route('/del/')
def delete_cookie():
    resp = Response("刪除cookie")
    #設刪除cookie,
    resp.delete_cookie('username')
    return resp

 1.4.設定cookie過期時間

引數解釋:

  • max_age:以秒為單位,距離現在多少秒後cookie會過期
  • expires:datetime型別,這個時間需要設定為格林尼治時間,也就是要距離北京少8個小時
  • 如果max_age和expires都設定了,那麼這時候以max-age為標準
  • 如果沒有指定過期時間,則預設為瀏覽器關閉後過期

程式碼如下:

@app.route('/')
def hello_world():
    resp = Response("設定cookie")
    # 1.使用expires引數,就必須使用格林尼治時間
    # 通過expires引數設定有效期的時候,就要相對北京時間少8個小時,所有這裡hours是16,
    # 如果直接days=31,就不準確了
    expires = datetime.now() + timedelta(days=30,hours=16)
    resp.set_cookie('username','derek',expires=expires)
    
    # 2.使用max_age引數設定過期時間(1分鐘後後期)
    # resp.set_cookie('username','derek',max_age=60)
    return resp

 1.5. session

flask操作session

  • 設定session:通過flask.session就可操作session了,操作session就跟操作字典是一樣的。session['username'] = 'derek'
  • 獲取session:也是類似字典,session.get('key')
  • 刪除session:session.pop(key),刪除指定的值;session.clear(),刪除session中所有的值
  • 設定session有效期:如果沒有設定session的有效期。那麼預設就是瀏覽器關閉後過期。如果設定session.parmanent=True,那麼就會預設31天后過期。如果不想在31天后過期,那麼可以設定app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2),可以指定多久後過期(比如:2小時)。
  • cookies 中的 session 是什麼

    cookies 中 session 儲存的是通過 secret_key 加密後的 key , 通過這個 key 從flask程式的記憶體中找到使用者對應的session資訊

程式碼如下:

from flask import Flask,session
import os
from datetime import timedelta

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
#自定義設定session的有效期
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)

@app.route('/')
def index():
    # 設定session
    session['username'] = 'derek'
    # permanent:過期時間,預設為false,如果設定為True,則預設為31天之後過期
    # 可以通過app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
    # 來自定義過期時間,這樣設定後,session.permanent = True的session有效期則為兩個小時
    session.permanent = True
    return 'Hello World!'

@app.route('/get_session/')
def get_session():
    #獲取session
    username = session.get('username')    # derek
    return username

@app.route('/delete_session/')
def delete_session():
    #刪除session
    session.pop('username')    #刪除指定的session
    # session.clear()          #刪除所有session
    return '刪除成功'

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

 

cookie:在網站中,http請求是無狀態的。也就是說即使第一次和伺服器連線後並且登入成功後,第二次請求伺服器依然不能知道當前請求是哪個使用者。cookie的出現就是為了解決這個問題,第一次登入後伺服器返回一些資料(cookie)給瀏覽器,然後瀏覽器儲存在本地,當該使用者傳送第二次請求的時候,就會把上次請求儲存的cookie資料自動的攜帶給伺服器,伺服器通過瀏覽器攜帶的資料就能判斷當前是哪個使用者了。cookie儲存的資料量有限,不同的瀏覽器有不同的儲存大小,但一般不超過4kb。因此使用cookie只能儲存一些小量的資料。

session:session和cookie的作用有點類似,都是為了儲存使用者相關的資訊。不同的是,cookie是儲存在本地瀏覽器,而session儲存在伺服器。儲存在伺服器的資料會更加安全,不容易被竊取。但儲存在伺服器也有一定的弊端,就是會佔用伺服器的資源,但現在伺服器已經發展至今,儲存一些session資訊還是綽綽有餘的。

cookie和session結合使用:cookie和session的使用已經出現了一些非常成熟的方案。一般有兩種儲存方式

  • 儲存在服務端:通過cookie儲存一個session_id,然後具體的資料則儲存在session中。如果使用者已經登入,則伺服器會在cookie中儲存一個session_id,下次再請求的時候,會把該session_id攜帶上,伺服器根據session_id在sesson庫中獲取使用者的session資料。就能知道該使用者到底是誰,以及之前儲存的一些狀態資訊。這種專業術語叫做 server side session.
  • 將session資料加密,然後儲存在cookie中。這種專業術語叫做 client side session。flask採用的就是這種方式,但是也可以替換成其它方式。

1.2.設定cookie

設定cookie:應該在Response的物件上設定。flask.Response物件上有一個set_cookie方法,可以通過這個方法來設定cookie資訊。

 
from flask import Flask,request,Response

app = Flask(__name__)

@app.route('/')
def hello_world():
    resp = Response("伺服器返回資訊")
    #設定cookie,
    resp.set_cookie('username','derek')
    return resp

if __name__ == '__main__':
    app.run()
複製程式碼

引數介紹:原始碼

 def set_cookie(self, key, value='', max_age=None, expires=None,
                   path='/', domain=None, secure=False, httponly=False,
                   samesite=None):
  • key:鍵
  • value:值
  • max_age:設定過期時間(秒)
  • expires:設定過期時間,時間戳的形式(1970離現在的時間)
  • path:當前主域名
  • domain:子域名

1.3.刪除cookie

刪除cookie,通過Response.delete_cookie方法,指定cookie的key,就可以刪除cookie了

 
@app.route('/del/')
def delete_cookie():
    resp = Response("刪除cookie")
    #設刪除cookie,
    resp.delete_cookie('username')
    return resp

 1.4.設定cookie過期時間

引數解釋:

  • max_age:以秒為單位,距離現在多少秒後cookie會過期
  • expires:datetime型別,這個時間需要設定為格林尼治時間,也就是要距離北京少8個小時
  • 如果max_age和expires都設定了,那麼這時候以max-age為標準
  • 如果沒有指定過期時間,則預設為瀏覽器關閉後過期

程式碼如下:

@app.route('/')
def hello_world():
    resp = Response("設定cookie")
    # 1.使用expires引數,就必須使用格林尼治時間
    # 通過expires引數設定有效期的時候,就要相對北京時間少8個小時,所有這裡hours是16,
    # 如果直接days=31,就不準確了
    expires = datetime.now() + timedelta(days=30,hours=16)
    resp.set_cookie('username','derek',expires=expires)
    
    # 2.使用max_age引數設定過期時間(1分鐘後後期)
    # resp.set_cookie('username','derek',max_age=60)
    return resp

 1.5. session

flask操作session

  • 設定session:通過flask.session就可操作session了,操作session就跟操作字典是一樣的。session['username'] = 'derek'
  • 獲取session:也是類似字典,session.get('key')
  • 刪除session:session.pop(key),刪除指定的值;session.clear(),刪除session中所有的值
  • 設定session有效期:如果沒有設定session的有效期。那麼預設就是瀏覽器關閉後過期。如果設定session.parmanent=True,那麼就會預設31天后過期。如果不想在31天后過期,那麼可以設定app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2),可以指定多久後過期(比如:2小時)。
  • cookies 中的 session 是什麼

    cookies 中 session 儲存的是通過 secret_key 加密後的 key , 通過這個 key 從flask程式的記憶體中找到使用者對應的session資訊

程式碼如下:

from flask import Flask,session
import os
from datetime import timedelta

app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)
#自定義設定session的有效期
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)

@app.route('/')
def index():
    # 設定session
    session['username'] = 'derek'
    # permanent:過期時間,預設為false,如果設定為True,則預設為31天之後過期
    # 可以通過app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)
    # 來自定義過期時間,這樣設定後,session.permanent = True的session有效期則為兩個小時
    session.permanent = True
    return 'Hello World!'

@app.route('/get_session/')
def get_session():
    #獲取session
    username = session.get('username')    # derek
    return username

@app.route('/delete_session/')
def delete_session():
    #刪除session
    session.pop('username')    #刪除指定的session
    # session.clear()          #刪除所有session
    return '刪除成功'

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