Bottle 自身并没有提供 Session 的支持,因为在一个迷你框架里面,没有合适的方法来实现。根据需求和使用环境,你可以使用 beaker 中间件或自己来实现。
beaker相关文档:http://beaker.readthedocs.org/en/latest/index.html
Beaker 是一个缓存和会话的库,与 Web 应用程序和独立的 Python 脚本及应用程序一起使用。它是 WSGI 的中间件,能够很简单地嵌入,与基于 WSGI 的 Web 应用程序一起使用,并且缓存修饰器对于任何基于 Python 的应用程序都是容易使用的。
延迟加载会话:在一个请求中拥有活动的会话也不会运行,除非它们被实际地使用。
性能:当进行缓存时,利用一个多读器/单写器锁定系统,以防止 Dog-Pile 的影响。
多后端:会话和缓存是基于文件、DBM 文件、memcached、memory 和数据库后端可用的(通过 SQLAlchemy)。
基于 Cookie 的会话:为客户端基于 Cookie 的会话存储使用带有可选的 AES 加密的 SHA-1 签名。
灵活的缓存:数据能以每函数形式被存储,使用不同的后端、不同的期限和不同的键。
可扩展的后端:使用支持新后端的 setuptools 入口点来添加更多的后端。
要用使用breaker,需要安装一下哦,不会安装请看《python bottle 框架环境安装》
pip install beaker
然后要在文件里导入相关的beaker方法:
#设置session参数
session_opts = {
'session.type':'file', # 以文件的方式保存session
'session.cookei_expires':3600, # session过期时间为3600秒
'session.data_dir':'/tmp/sessions', # session存放路径
'sessioni.auto':True
}
Session 数据存放在'/tmp/' 目录里面,/tmp/有个机制,会自动清理30天后末使用过的文件,有点类型于回收站,所以把 session文件放在这里,是最合适的,你不需要担心session文件不断增多的问题。当然也可以用memcached来存放session,便我们在这里,仅使用file类型来示例。
然后在run的时候,要用:
app = default_app()
app = SessionMiddleware(app, session_opts)
run(app=app,host='0.0.0.0', port=8080,debug=True)
以下是相关代码示例:
[root@linuxyw bottle]# cat main.py
#/usr/bin/env python
#coding=utf-8
from bottle import route, run ,redirect,request,default_app
from beaker.middleware import SessionMiddleware
#设置session参数
session_opts = {
'session.type':'file', # 以文件的方式保存session
'session.cookei_expires':3600, # session过期时间为3600秒
'session.data_dir':'/tmp/sessions', # session存放路径
'sessioni.auto':True
}
@route('/login')
def login():
return '''
Username:
Password:
'''
@route('/login', method='POST')
def do_login():
username = request.forms.get('username')
password = request.forms.get('password')
if username == 'linuxyw.com' and password == 'www.linuxyw.com':
s = request.environ.get('beaker.session') #如果帐号密码正确,则获取环境变量中的beaker.session对象,并赋值给s,然后我们就可以用字典的方式,往s里面添加一些我们要存进去的数据,如帐号名,帐号id,权限等等
s['user'] = username
s.save()
return redirect('/')
@route('/')
def index():
for k,v in request.environ.items():
print "K:%s V:%s" %(k,v)
s = request.environ.get('beaker.session') #获取session
username = s.get('user',None) #从session中获取Key为user的值,是上面登陆的时候保存进来的
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=8080,debug=True)
打开浏览器访问首页,会被跳转到login登陆页,除非登陆正确,否则会一直跳到login页面中,登陆正确的话,就会跳到首页去了,我用程序上写死的帐号和密码来登陆看看效果
帐号: linuxyw.com
密码:www.linuxyw.com
beaker.middleware
在看看/tmp/session下面生成的 session文件(只要刚才session正常使用才会生成)
[root@linuxyw bottle]# tree /tmp/sessions/
/tmp/sessions/
├── container_file
│ └── 6
│ └── 65
│ └── 65a0217e48d64191b01c28878b8419fc.cache
└── container_file_lock
└── a
└── ae
└── aecb616886c815cf35a2da619fd1ccbde8fb2340.lock
大家可以运行上面的代码演示一下,代码上提到SVN中,有需要的朋友可在SVN下载
如果有不懂的,可以看bottle官网文档
官方文档:http://www.bottlepy.org/docs/dev/index.html