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

时间:2012-07-28 05:12:03

标签: python bottle

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

我的代码是这样的:

@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

1 个答案:

答案 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