Flask - Cookie的使用

千鋒Python唐小強發表於2020-08-14

Flask - Cookie的使用

使用者使用瀏覽器第一次訪問服務端時,服務端生成cookie,放在響應response裡返回,並儲存在使用者瀏覽器裡.


from flask 
import Flask,make_response

@app.route( '/set/<name>')
def set_cookie (name):
   response = make_response(redirect(url_for( 'hello')))
 response.set_cookie( 'name',name) # set_cookie檢視會在生成的響應報文首部中建立一個Set-Cookie欄位,即"Set-Cookie: name=xxx;Path=/"
 return response

使用者下次訪問同一個服務端時,會在header裡攜帶已儲存的cookie.

from flask 
import Flask,
request

@app.route( '/')
@app.route( '/hello')
def hello():
   name = request.args. get( 'name')  #如果查詢引數裡沒有name值則從cookie獲取
  if name is None:
   name = request.cookies. get( 'name', 'Human')  #從Cookie中獲取name值
  return '<h1>Hello,%s</h1>' % name          

因為使用者可以直接修改瀏覽器的cookie值,冒用他人賬戶,所以直接使用cookie是不安全的.

Flask提供了session物件用來將Cookie資料加密儲存.(預設情況下,它會把資料儲存在瀏覽器上一個名為session的cookie裡)

app.secret_key = 'secret string' #設定金鑰

更安全的做法是把金鑰寫進系統環境變數(在命令列中使用export或set命令),或是儲存在.env檔案中

SECRET_KEY=secret string

然後在程式指令碼中使用os模組提供的getenv()方法獲取:

app.secret_key = os.getenv('SECRET_KEY','secret string') #第二個引數是作為沒有獲取到對應環境變數時使用的預設值`

#結合使用

@app.route( '/login')
def login():
   session[ 'logged_in'] = True
   #寫入session. 向session中新增一個名為logged_in的cookie,將它的值設為True.
   #使用session物件新增cookie時,資料會使用程式的金鑰對其進行簽名,加密後的資料儲存在一塊名為session的cookie裡. 使用者可以看到加密後的值,但無法修改它,一旦資料被修改,簽名的值也會變化,這樣在讀取時會驗證失敗,對應的session值也會隨之失效.
    return redirect(url_for( 'hello'))
@app.route( '/hello')
def hello():
   name = request.args. get( 'name')
    if name is None:
       name = request.cookies. get( 'name', 'Human')
       response = '<h1>Hello, %s!</h1>' % name
       
   #session中的資料可以像字典一樣透過鍵讀取,或是使用 get()方法.
    if 'logged_in' in session:  #根據使用者認證狀態返回不同的內容.
       response += '[Authenticated]'
    else:
       response += '[Not Authenticated]'
   
    return response

登出使用者的賬戶,實際操作其實就是把代表使用者認證的logged_in cookie刪除,透過session物件的pop方法實現.


from flask 
import session

@app.route( '/logout')
def logout ():
  if 'logged_in' in session:
   session.pop( 'logged_in')
  return redirect(url_for( 'hello'))

預設情況下,session cookie會在使用者關閉瀏覽器時刪除.

透過將session.permanent屬性設定為True可以將session的有效期延長為Flask.permanent_session_lifetime屬性值對應的datetime.timedelta物件.

也可以透過配置變數PERMANENT_SESSION_LIFETIME設定,預設為31天.

儘管session物件會對Cookie進行簽名並加密,但這種方式僅能夠確保session的內容不會被篡改,加密後的資料藉助工具仍然可以輕易讀取(即時不知道金鑰),所以絕對不能在session中儲存使用者密碼等敏感資訊.

Flask - Cookie的使用


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69923331/viewspace-2711729/,如需轉載,請註明出處,否則將追究法律責任。

相關文章