【发布时间】:2012-11-23 23:50:06
【问题描述】:
第一次在这里提问。
我目前正在努力研究如何使用 Bottle 微框架正确使用 Beaker。这是有问题的程序:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# filename: server.py
import bottle as app
from beaker.middleware import SessionMiddleware
session_options = {
'session.type': 'file',
'session.data_dir': './session/',
'session.auto': True,
}
app_middlware = SessionMiddleware(app.app(), session_options)
app_session = app.request.environ.get('beaker.session')
@app.route('/login')
def login():
app_session = app.request.environ.get('beaker.session')
app_session['logged_in'] = True
@app.route('/logout')
def logout():
app_session = app.request.environ.get('beaker.session')
if app_session.get('logged_in'):
app_session['logged_in'] = False
return 'You are logged out'
app.redirect('/login')
@app.route('/dashboard')
def dashboard():
app_session = app.request.environ.get('beaker.session')
if app_session.get('logged_in'):
return 'You are logged in'
app.redirect('/login')
app.debug(True)
app.run(app=app_middlware, reloader=True)
如果你注意到了,我会继续在每个 def 块上调用 app_session = app.request.environ.get('beaker.session'),这样它就不会返回如下错误:TypeError: 'NoneType' object does not support item assignment --- 似乎 Python 无法识别其函数之外的变量(如果我错了,请纠正我)。
以下是问题:
- 我应该怎么做才能只有一个
app_session = app.request.environ.get('beaker.session')实例,以便它可以用于每个def块(我真的需要一个实例,因为要检查和使用同一个会话)。 - 如果这是唯一的方法(虽然它很丑),那么我是否应该将所有需要会话的路由组合起来,以便实现
app_session的单个实例?
类似:
@app.route('/<path:re:(login|dashboard|logout)\/?>')
def url(path):
app_session = app.request.environ.get('beaker.session')
if 'login' in path:
app_session['logged_in'] = True
elif 'logout' in path:
if app_session.get('logged_in'):
# app_session.delete() it doesn't seem to work?
app_session['logged_in'] = False
return 'You are logged out'
app.redirect('/login')
elif 'dashboard' in path:
if app_session.get('logged_in'):
return 'You are logged in'
app.redirect('/login')
【问题讨论】:
-
那么当您不在每个视图函数中重新定义
app_session并且只使用全局范围内的那个时会发生什么? -
它返回一个错误,像这样:
File "server.py", line 14, in login app_session['logged_in'] = True TypeError: 'NoneType' object does not support item assignment -
对不起 Blender,但在发布问题之前我已经这样做了。并且
SessionMiddleware(app, session_options)也会导致错误,它应该是SessionMiddleware(app.app(), session_options)。 -
因为这样的问题我切换到了 Flask... 最后一次尝试:尝试使用
app_middleware.session而不是app.session看看是否有帮助。