3

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

我的代码是这样的:

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

感谢您的任何帮助或指点!

PS。整个代码都在这个仓库中:https ://github.com/curtisgithub/labinski/blob/master/labinski.py

4

1 回答 1

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
于 2012-11-13T04:38:43.553 回答