用户使用浏览器第一次访问服务端时,服务端生成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 发布