最近用Python的bottle框架搭建了一个小的网站,想给网站加入一个登陆页面,突然发现竟然没有考虑不同用户的问题。。。。。。毕竟这个东西不是我一个人用,查了一些资料发现session,cookie能满足这个需求。简单点说session和cookie是一种保持会话状态的机制,说明浏览器和服务器建立了会话连接。cookie是用于浏览器一侧的,将用户信息保存在cookie文件中,session是用于服务器一侧的,将用户信息保存在session文件中。实际上这两种方式,任选一种都可以实现用户信息验证,考虑到下面几个问题,最后决定使用session的方式来实现这个功能。
bottle本身不包含session功能,可以使用第三方插件beaker,下面说一下bottle中session的实现,在网上搜索到的资料基本都是下面的方式(亲测有些问题):
参考网站:http://www.linuxyw.com/630.html
from bottle import route, run, redirect, request, default_app
from beaker.middleware import SessionMiddleware
import copy
# 设置session参数
session_opts = {
'session.type': 'file', # 以文件的方式保存session
'session.cookie_expires': 3600, # session过期时间为3600秒
'session.data_dir': 'sessions', # session存放路径
'session.auto': True
}
@route('/login')
def login():
return '''
<html>
<head>
</head>
<body>
<form action="/login" method="post">
Username: <input name="username" type="text" />
Password: <input name="password" type="password" />
<input value="Login" type="submit" />
</form>
</body>
</html>
'''
@route('/login', method='POST')
def do_login():
username = request.forms.get('username')
password = request.forms.get('password')
if username == 'name' and password == 'password':
'''
如果帐号密码正确,则获取环境变量中的beaker.session对象,
并赋值给s,然后我们就可以用字典的方式,往s里面添加一些我们要存进去的数据,
如帐号名,帐号id,权限等等
'''
s = request.environ.get('beaker.session')
print(s)
s['user'] = username
s.save()
return redirect('/')
@route('/')
def index():
s = request.environ.get('beaker.session') # 获取session
username = s.get('user', None) # 从session中获取Key为user的值,是上面登陆的时候保存进来的
print(s)
if not username:
return redirect('/login')
return "欢迎你:%s" % username
app = default_app()
app = SessionMiddleware(app, session_opts)
run(app=app, host='0.0.0.0', port=8180, debug=True)
亲测发现有些问题:
1、session一直存在,并没有失效。
又尝试了很多方法,搜索了很多资料,最后发现在session的配置参数中有一个参数timeout,如果我们使用session的方式,从描述上来看,我们使用timeout参数更加合理。尝试将配置'session.cookie_expires': 30,修改为'session.timeout': 30,session在30秒后失效,说明这里应该使用timeout参数。
2、session文件并没有删除。
大部分博客中都将session.cookie_expires这个参数描述为可以在设定时间后删除session文件,但经过反复的实际测试发现根本不是那么回事,查询了下官方手册发现Beaker压根就没有这个功能,需要用户自己实现。
还有些博客中介绍可以使用delete()方法,这个方法可以删除session中的内容但是并不能删除生成的session文件。所以在实际应用的时候文件的删除还需要用户单独管理。
运行delete方法虽然删除了session中的内容但是session文件依然存在。