如何在Python的Bottle框架中使用Session

最近用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文件依然存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值