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 '''
- <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 == '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
在看看/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
SVN详情请跳转至:python bottle框架(WEB开发、运维开发)教程
来自外部的引用: 1