2012-07-28 94 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