2012-07-28 41 views
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') 

除外/登录每个路由请求。我知道有一个瓶子挂钩系统可以在请求之前执行任务,但我不确定如何最好地使用它来检查是否有人登录。

我是相当新的使用瓶的python webapps。没有多少人将它与烧杯会话中间件一起使用,所以我没有很多例子可以解决。

感谢您的帮助或指点!

PS。这样做的全部代码在此回购:https://github.com/curtisgithub/labinski/blob/master/labinski.py

+0

你有没有找到这个问题的答案?在过去的几周里,我一直在和瓶子一起玩耍......今天开始关注烧杯,我自己......并且有点想到同样类型的问题。 :) – summea 2012-10-27 04:22:17

回答

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 
+0

if request.urlparts.path =='/ login':continue 完美工作去除死循环 – 2013-07-19 12:16:19