用戶使用瀏覽器第一次訪問服務端時,服務端生成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 發佈