2012-05-14 11 views

答えて

3

これを行う最も簡単な方法は、私が考えるように、それが記述されている方法と同様の青写真を使用することです。in this snippet次に、URLが/adminで始まるときに各リクエストの前に実行されるコードを作成し、そのコード内で認証を行うことができます。

3

明らかに、セッションをテストするデコレータを作成し、認証に失敗した場合は別のページにリダイレクトします。どのくらいのpythonを知っているのか分かりませんが、デコレータは関数を受け取り、別の関数を返す関数です。基本的には、それは関数修飾子です。ここでは、セッションを確認するためにあなた自身を書き込む方法を示すべきデコレータです:

import functools 

def check_session(view): 
    @functools.wraps(view) 
    def inner(*args, **kwargs): 
     if <test for auth>: 
      return view(*args, **kwargs) 
     else: 
      return flask.redirect("/") 
    return inner 

あなたが見ることができるように、我々は、ビュー機能を取り、関数がチェックするインナーと呼ばれる新しい関数を定義してい成功すると元のビューを呼び出します。 @functools.wraps(view)という行は、デコレータを使用した例です。 functools.wrapsデコレータは、最初の引数として与えられた関数のプロパティをラップする関数を与えます。このデコレータを使用するには、次のようなご意見にそれを適用します。

@app.route("/admin") 
@check_session 
def admin_view(): 
    return "Top secret" 

認証チェックを失敗したすべてのユーザーは、今すぐにリダイレクトされ、行うユーザーは、いつものようにビューを見ることができます。デコレータは最下位から順番に適用されるため、機能登録を行っている他のデコレータ(つまり@app.route)の後ろに置いてください。

+1

私はPythonの初心者です。あなたのメソッドを使うことを理解しているので、/ adminの下にあるすべての関数定義に@check_sessionデコレータを置く必要があります。それを1か所にしか置くことはできません。あれは正しいですか? –

+1

タイピングが少ない他の解決策があるかもしれませんが、それらはおそらくハッキーで維持しにくいでしょう。デコレータの良い点は、それらが非常に明示的であり、ソース内の関数宣言と同じ場所にあることです。 – BluePeppers

関連する問題