瓶钩与烧杯会话中间件和检查登录

2024-10-01 17:40:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我的代码是:

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

我对使用瓶子的python webapps还是个新手。并不是很多人将它与烧杯会话中间件一起使用,所以我没有太多的例子可供参考。在

谢谢你的帮助和建议!在

补充说明。整个代码都在这个repo中:https://github.com/curtisgithub/labinski/blob/master/labinski.py


Tags: 中间件代码name应用程序瓶子bottlesessionlogin
1条回答
网友
1楼 · 发布于 2024-10-01 17:40:52

I know there is a bottle hook system to do things before requests, but I'm not sure how best to use it to check if someone is logged in or not.

您可以使用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时,这将导致重定向循环。你可以把这个加到钩子上,也许:

^{pr2}$

另一个解决方案是使用Python decorator实现类似的功能,它允许您逐个方法控制访问。例如,你可以这样说:

@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

相关问题 更多 >

    热门问题