2014-03-24 4 views
3

403 금지됨에 직면했을 때 사용자를 로그인 페이지로 리디렉션 할 수 있습니까?django 403 금지 - 로그인으로 리디렉션

다음 코드 고려 : 나는/도메인을 방문하는 경우

urls.py

router = routers.DefaultRouter() 
router.register(r'users', views.UserViewSet) 

urlpatterns = patterns('', 
    url(r'^', include(router.urls)), 
) 

views.py

class UserViewSet(viewsets.ModelViewSet): 
     queryset = User.objects.all() 
     serializer_class = UserSerializer 

     renderer_classes = (renderers.JSONRenderer, renderers.TemplateHTMLRenderer) 
     template_name='rest_framework/users.html' 

     def list(self, request, *args, **kwargs): 
      response = super(viewSet, self).list(request, *args, **kwargs) 
      if request.accepted_renderer.format == 'html': 
       return Response({'request':request, 'queryset': response.data['results']}) 
      return response 

를/사용자가 로그인하지 않은 반면, I 403 금지됨 오류가 발생합니다. 대신 로그인 페이지로 리디렉션하고 싶습니다. 즉, 403 오류를 표시하지 말고 대신 로그인 페이지로 직접 리디렉션하십시오.

@login_required 
def list(...): 

을하지만 작동하지 않습니다

나는 퍼팅 시도했다. 나는 그 내부 viewset 때문에 가정합니다.

def list(...): 
    if not request.user.is_authenticated(): 
     return render_to_response('domain/login.html') 

을하지만 다시 작동하지 않습니다

나 또한 노력했다.

다양한 403middlewares를 시도했지만 아무 소용이 없습니다.

나는
handler403 = 'site.views.login' 

없음 성공 urls.py

에 handler403 핸들러를 통해 리디렉션했습니다.

어떻게해야합니까?

장고 버전 : 1.5.4

답변

2

당신은 클래스 메소드에 표준 login_required 장식을 사용할 수 없습니다.

from django.utils.decorators import method_decorator 
from django.contrib.auth.decorators import login_required 

class UserViewSet(viewsets.ModelViewSet): 
... 
@method_decorator(login_required) 
def dispatch(self, request, *args, **kwargs): 
    .... 

( https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/#decorating-class-based-views 참조)

url(r'...', login_required(UserViewSet.as_view())) 

또는 django.utils.decorators.method_decorator로 장식 포장 및 클래스 dispatch 방법에 적용 : 당신은 당신이 URL에서 사용할 때 as_view()를 포장 중 하나가

클래스 기반보기의 경우 다시 사용할 수있는 PermissionRequiredMixin에 통합 할 수 있습니다 (https://stackoverflow.com/a/6455140/839875

참조).

은 또는 당신이 나를 위해 일 django.views.defaults.permission_denied

이 (https://docs.djangoproject.com/en/1.5/topics/http/views/#the-403-http-forbidden-view 참조) 장고 잡을 것 django.core.exceptions.PermissionDenied 예외

+0

을 올릴 수 있습니다. 고맙습니다. 클래스 UserViewSet (...) @method_decorator (로그인 필요) def dispatch (self, * args, ** kwargs) : return super (ProtectedView, self).dispatch (* args, ** kwargs) – user3417614

+0

당신도 그것을 위해 사용할 수있는 깔끔한 믹스 인이 있는데, 그것을 내 대답에 추가했습니다. – ACGray