我知道有一个瓶子钩子系统可以在请求之前做一些事情,但我不确定如何最好地使用它来检查某人是否登录。
您可以使用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