我正在用烧杯会话中间件编写一个瓶子应用程序。
我的代码是这样的:
@bottle.route('/')
def slash():
try:
beaker_session = request.environ['beaker.session']
except:
#redirect('/login')
abort(401, "Failed beaker_session in slash")
try:
name = beaker_session['name']
except:
redirect('/login')
除了/ login之外的每个路由请求。我知道有一个瓶子挂钩系统可以在请求之前做一些事情,但我不确定如何最好地使用它来检查是否有人登录。
我对使用bottle的python webapps相当新。不是很多人在烧杯会话中间件中使用它,所以我没有很多例子可供使用。
感谢您的帮助或指示!
PS。此代码的完整代码位于此repo中:https://github.com/curtisgithub/labinski/blob/master/labinski.py
答案 0 :(得分:5)
我知道有一个瓶子挂钩系统可以在请求之前做一些事情,但我不知道如何最好地使用它来检查是否有人登录。
您可以使用before_request
挂钩在每个请求之前运行代码,但只有在您希望所有访问进行身份验证时才检查身份验证。你可以这样做:
@bottle.hook('before_request')
def setup_request():
try:
beaker_session = request.environ['beaker.session']
except:
#redirect('/login')
abort(401, "Failed beaker_session in slash")
try:
name = beaker_session['name']
except:
redirect('/login')
...但是如果没有一些额外的代码,当某人实际请求/login
时,这将导致重定向循环。所以你可以将它添加到钩子中,也许:
if request.urlparts.path == '/login':
continue
另一个解决方案是使用Python装饰器实现类似的功能,它允许您逐个方法地控制访问。例如,您可以说:
@route('/')
@authenticated
def index():
return 'This is /.'
@route('/login')
def login():
return 'This is login.'
然后你的authenticated
装饰器看起来非常像钩子:
def authenticated(func):
def wrapped(*args, **kwargs):
try:
beaker_session = request.environ['beaker.session']
except:
abort(401, "Failed beaker_session in slash")
try:
name = beaker_session['name']
return func(*args, **kwargs)
except:
redirect('/login')
return wrapped