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 中存储用户明码等敏感信息.
本文由博客群发一文多发等经营工具平台 OpenWrite 公布