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

もう 1 つの解決策は、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 に答える