9.Flask Cookie和Session

1.1.概念

cookie:在網站中,http請求是無狀態的。也就是說即便第一次和服務器鏈接後而且登陸成功後,第二次請求服務器依然不能知道當前請求是哪一個用戶。cookie的出現就是爲了解決這個問題,第一次登陸後服務器返回一些數據(cookie)給瀏覽器,而後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會把上次請求存儲的cookie數據自動的攜帶給服務器,服務器經過瀏覽器攜帶的數據就能判斷當前是哪一個用戶了。cookie存儲的數據量有限,不一樣的瀏覽器有不一樣的存儲大小,但通常不超過4kb。所以使用cookie只能存儲一些小量的數據。flask

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()

參數介紹:源碼cookie

 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了session

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

 

1.4.設置cookie過時時間

參數解釋:app

  • max_age:以秒爲單位,距離如今多少秒後cookie會過時
  • expires:datetime類型,這個時間須要設置爲格林尼治時間,也就是要距離北京少8個小時
  • 若是max_age和expires都設置了,那麼這時候以max-age爲標準
  • 若是沒有指定過時時間,則默認爲瀏覽器關閉後過時

代碼以下:dom

@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操做sessionide

  • 設置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小時)。

代碼以下:網站

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)
相關文章
相關標籤/搜索