2013-05-01 2 views
0

내 앱에 클래스 기반보기가 많이 있습니다. 그들 중 대부분은 인증 된 직원 만이 접근 할 수 있어야합니다. 어떻게하면 클래스 기반 뷰를 많이 사용자 정의 할 수 있습니까?django 클래스 기반보기에 대한 사용자 인증 확인 추가

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', {}) 

가 어떻게 같은 클래스 기반 뷰와 비슷한 뭔가를해야만 수행 할 수 있습니다 STANDART 기능 뷰

는이 같은 장식을 추가?

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

일부 믹스 인을 추가하거나 일부 메소드를 덮어 써야합니까? 아니면 뭔가 꾸미나요?

답변

4

클래스 기반보기의 디스패치 메서드를 장식해야합니다. 아래를 참조하십시오.

docs here을 참조하십시오.

4

사실, 로그인을 원하는 모든 뷰 클래스의 dispatch 메소드를 장식하는 것을 피하려면 적어도 세 가지 방법이 있습니다.

당신은 단지 몇 등의 의견이있는 경우,이 같은 URLconf에서 그 장식 사용할 수 있습니다 : 당신이 보호하기 위해 좀 더 의견이있는 경우

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

, 그리고 더 나은을 사용하는 것입니다 LoginRequiredMixindjango-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)) 
2

LoginRequiredMixin을 사용할 수 있습니다. 그러면 인증되지 않은 사용자가 페이지 집합으로 리디렉션됩니다.

from braces.views import LoginRequiredMixin 

class DashboardIndex(LoginRequiredMixin, TemplateView): 

template_name = 'dashboard/index.html' 
login_url = 'action:login' #Where you must set the page else will use default. 
raise_exception = False 

https://django-braces.readthedocs.org/en/latest/access.html#loginrequiredmixin