2010-12-01 27 views
3

ここは私の見解です。基本的には、ログインしているかどうかに基づいて異なるレスポンスを返します。Django/Pythonビューのデコレータを作成するにはどうすればよいですか?

@check_login() 
def home(request): 
    if is_logged_in(request): 
     return x 
    else: 
     return y 

ここは私のデコレータコードです。私はちょうど要求は、ヘッダーを持っているかどうかを確認したい、そうであれば、彼をログに記録します。

#decorator to log the user in if there are headers 
def check_login(): 
    def check_dec(func): 
     if request.META['username'] == "blah": 
      login(request, user) 

    return check_dec 

問題is..Iこの場合、適切なデコレータを書く方法がわかりません!議論は何ですか?どのような機能ですか?どうやって?

答えて

11

使用を取得し、ユーザはグループ1またはグループ2のいずれかにすることができ

@group_required(["group1", "group2"]) 
def show_index(request): 
    view_code_here 

のようにそれを使用

https://github.com/mzupan/django-decorators/blob/master/auth.py

あなたのデコレータは、あなたがしているように飾りを返さなければなりませんhome = check_login()(home)

ここでは例デコレータだ:

def check_login(method): 
    @functools.wraps(method) 
    def wrapper(request, *args, **kwargs): 
     if request.META['username'] == "blah" 
      login(request, user) # where does user come from?! 
     return method(request, *args, **kwargs) 
    return wrapper 

このデコレータは、ユーザー名フィールドが「何とか」に設定されている場合は、ログイン機能を実行呼び出して、元のメソッドを呼び出します。

3

単純なデコレータは、単に関数やクラスをとり、他のもの(通常は同じ型ですが、これは必須ではありません)を返す関数です。 parametrizedデコレータは、デコレータを返す関数です。

だから、このことを念頭に置いて、我々はクロージャを作成し、それを返します。ここでは

def check_login(func): 
    def inner(request, *args, **kwargs): 
    if request.META['username'] == 'blah': 
     login(request, user) # I have no idea where user comes from 
    func(request, *args, **kwargs) 
    return inner 
+0

リクエストからユーザを取得できます: 'request.user' –

2

は、私は、ユーザーが特定のグループ内にあるかどうかを確認するために書いたデコレータです。それはもう少し示しています。それ以外の場合は - あなたが唯一@check_login代わりcheck_login()のそうでない場合、彼らは404ページ

関連する問題