session相当于用密钥签名加密的cookie,即用户可以查看你的cookie,但是如果没有密钥就无法修改它。
使用会话之前你必须设置一个密钥:
from flask import Flask,session,redirect,url_for,escape,request
app=Flask(__name__)
@app.route('/')
def index():
if 'username' in session:
return 'Logged in as %s' %escape(session['username'])
return 'You are not logged in'
@app.route('/login',methods=['GET','POST'])
def login():
if request.method=='POST':
session['username']=request.form['username']
return redirect(url_for('index'))
return '''
<form action="" method='post'>
<p><input type=text name=username>
<p><input type=sumbit value=Login>
</form>
'''
@app.route('/logout')
def logout():
#如果会话中有用户名就删除它
session.pop('username',None)
return redirect(url_for('index'))
#设置密钥,复杂一点
app.secret_key='A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
这里用到的 escape() 是用来转义的。如果不使用模板引擎就可以像上例 一样使用这个函数来转义。
session的属性:
new:如果session是新的,那么就是True,否则是Flase
modified:如果session捕获到其已被修改,那么为True。但是在一些易变对象中,session的修改不被自动捕获,那么就需要自己显式地把它设置为True:
# this change is not picked up because a mutable object (here# a list) is changed.session['objects'].append(42)# so mark it as modified yourselfsession.modified = True
permanent:
如果设置为True的话,session的生命为 permanent_session_lifetime 秒(默认是31天)。如果设置为Flase的话,那么当用户关闭浏览器时,session便被删除了。
如何生成一个好的密钥:
可以使用随机生成器来生成一个好的随机种子:
>>>import os
>>>os.urandom(24)
'\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'
基于 cookie 的会话的说明: Flask 会把会话对象中的值储存在 cookie 中。在打开 cookie 的情况下,如果你访问会话对象中没有的值,那么会得到模糊的错误信息:请检查 页面 cookie 的大小是否与网络浏览器所支持的大小一致。