Flask - Cookie的使用

Flask - Cookie的使用

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

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裏)cookie

app.secret_key = 'secret string' #設置密鑰 session

更安全的作法是把密鑰寫進系統環境變量(在命令行中使用export或set命令),或是保存在.env文件中app

SECRET_KEY=secret string 工具

而後在程序腳本中使用os模塊提供的getenv()方法獲取:加密

app.secret_key = os.getenv('SECRET_KEY','secret string') #第二個參數是做爲沒有獲取到對應環境變量時使用的默認值`url

#結合使用
@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中存儲用戶密碼等敏感信息.

本文由博客羣發一文多發等運營工具平臺 OpenWrite 發佈
相關文章
相關標籤/搜索