1

アプリにクラスベースのビューがたくさんあります。それらのほとんどは、認証されたスタッフ ユーザーのみがアクセスできるようにする必要があります。多くのクラスベースのビューにユーザーチェックを簡単に追加するにはどうすればよいですか?

標準関数ビューの場合、次のようなデコレータを追加しました:

def only_staff_allowed(fn):
    '''decorator'''
    def wrapped(request, *args, **kwargs):
        if request.user.is_staff:
            return fn(request, *args, **kwargs)
        else:
            return HttpResponseRedirect(reverse('moderator:login'))
    return wrapped

@only_staff_allowed
def dashboard(request):
    ''' now accessible only by staff users '''
    return render(request, 'moderator/dashboard.html', {})

このようなクラスベースのビューと同様のことを行うにはどうすればよいですか?

class AddressesAddList(ListView):
    template_name = 'moderator/addresses/add_list.html'
    queryset = Address.objects.filter(need_moderating=True)
    paginate_by = 100

いくつかのミックスインを追加するか、いくつかのメソッドをオーバーライドする必要がありますか? それとも何か飾ってもいいですか?

4

3 に答える 3

6

dispatch実際には、ログインを必要とするすべてのビュー クラスのメソッドをデコレートしないようにする方法が少なくとも 3 つあります。

そのようなビューがいくつかしかない場合は、次のように URLconf でそのデコレータを使用できます。

url(r"^protected/$", login_required(ProtectedView.as_view()), name="protected_view"),

または、保護するビューがもう少しある場合は、LoginRequiredMixinfrom django-bracesを使用することをお勧めします。

from braces.views import LoginRequiredMixin

class ProtectedView(LoginRequiredMixin, TemplateView):
    template_name = 'secret.html'

また、保護するビューが多数ある場合は、ミドルウェアを使用して多数のビューを一気にカバーする必要があります。次の行に沿ったもの:

class RequireLoginMiddleware(object):
    """Requires login for URLs defined in REQUIRED_URLS setting."""
    def __init__(self):
        self.urls = tuple([re.compile(url) for url in REQUIRED_URLS])
        self.require_login_path = getattr(settings, 'LOGIN_URL', '/accounts/login/')
    def process_request(self, request):
        if not request.user.is_authenticated() and request.path != self.require_login_path:
            for url in self.urls:
                if url.match(request.path):
                    return HttpResponseRedirect(u"{0}?next={1}".format(self.require_login_path, request.path))
于 2013-05-01T17:43:02.833 に答える
4

クラスベースのビューのディスパッチ メソッドをデコレートする必要があります。下記参照。

from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from django.views.generic import TemplateView

class ProtectedView(TemplateView):
    template_name = 'secret.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(ProtectedView, self).dispatch(*args, **kwargs)

こちらのドキュメントを参照してください。

于 2013-05-01T11:44:18.417 に答える