带有烧杯会话中间件和检查登录的瓶子钩子

2024-02-27

我正在使用烧杯会话中间件编写一个瓶子应用程序。

我的代码是这样的:

@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 相当陌生。没有多少人将其与烧杯会话中间件一起使用,因此我没有很多示例可供参考。

感谢您的帮助或指点!

附言。完整代码在此存储库中:https://github.com/curtisgithub/labinski/blob/master/labinski.py https://github.com/curtisgithub/labinski/blob/master/labinski.py


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

您可以使用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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有烧杯会话中间件和检查登录的瓶子钩子 的相关文章

随机推荐