2013-04-14 11 views
19

view.pyビューをスーパーユーザーのみに限定する方法はありますか?

@login_required 
@permission_required('is_superuser') 
def score_reset(request): 
    pass 

url.py

url(r'^score-reset/$', score_reset, name='score-reset'),  

私は、次のコードを持っているし、私の驚きに、私はまだ非スーパーユーザでログインされているにもかかわらず、機能を打ちます。私は許可が拒否されることを期待していた。

私には何が欠けていますか?

答えて

33

is_superuserはアクセス権ではなく、ユーザーモデルの属性です。 Djangoはすでにこのチェックを実行するために別のdecorator you can make use of called user_passes_testを持っている:あなたは多くのビューには、このチェックを実行したい場合は

from django.contrib.auth.decorators import user_passes_test 

@user_passes_test(lambda u: u.is_superuser) 
def score_reset(self,...): 
    ... 
+0

'は許可ではありません –

+2

スーパーユーザーのみに制限を求める質問があります。サンプルコードは@user_passes_test(lambda u:u.is_superuser)でなければなりません。 – mhost

+0

'user_passes_test'を使って[上記のスニペット]を実行します。しかしこれは、スーパー以外のすべてのユーザのログインページにリダイレクトされることを考慮して、すでにログインしている場合でも、あなたの仕事を得るためにあなた自身のデコレータを書くことができます。 – allsyed

1

@user_passes_testはエレガントな解決策ではありません。 あなたは@staff_member_requireのような独自のdecorathorを簡単に書くことができます。

Here解決方法の1つが表示されます。

0

上記の回答はdjangoの非常に初期のバージョンのようです。 これは、より新しいバージョンのものより少し複雑です

django 1.11の場合、これは少し似ていますがより簡単な戦略です。ところで、私は `user_passes_test`は、既存のDjangoのデコレータなどという事実は` IS_SUPERUSERであることを言及してリンクしたどちらの答えとして、重複としてこれをマーキングいないよ

views.py

from django.contrib.auth.decorators import login_required 

@login_required 
def some_view(request): 
if request.user.is_superuser: 
    //allow access only to superuser 
    return render(request, 'app/template1.html', args) 
else: 
    //allow access only to user 
    return render(request, 'app/template2.html', args) 
関連する問題