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