2016-10-06 2 views
0

그래서 장고 대신 AJAX로 GET 요청을 처리하려고하므로 403 Forbidden (Given by D 장고)이 발생했을 때 간단한 팝업/모달을 jQuery와 함께 표시 할 수 있지만 지금은 계속 진행할 방법이 없습니다.Ajax를 사용하여 장고에서 PermissionDenied (403)을 잡는 방법?

이 요청을 처리하는 내 자바 스크립트에 있습니다 :

그냥 내 HTML에서 버튼을 얻고 클릭 이벤트를 대기한다.

main.js
$(document).ready(function(){ 
    $("#users_page").click(function(e){ 
    e.preventDefault(); 
    $.ajax({ 
     "method": "GET", 
     "url": "/dashby/users/", 
     "beforeSend": function(xhr, settings){ 
     console.log("Before send"); 
     }, 
     "success": function(result){ 
     window.location.href = "/dashby/users/"; 
     }, 
     "error": function(xhr, textStatus, error){ 
     console.log(error); 
     }, 
    }); 
    }); 
}); 

이 문제에 대한 내 view.py

class AllUsersViews(UserPassesTestMixin, View): 
    template_name = 'all_users.html' 
    raise_exception = True # Raise PermissionDenied(403) 

    def test_func(self): 
     #Only superusers can access this view. 
     if self.request.user.is_superuser: 
      return True 

    def get(self, request): 
     context = {'users': User.objects.all()} 
     return render(request, self.template_name, context) 

그래서 지금 메신저 내가 원하는 페이지로 리디렉션 할 수 있지만, 슈퍼 유저가 나는 할 수 있도록하려면 Django에 의해 PermissionForbidden이 발생하면 기본적으로 사용자에게 권한 (팝업 또는 모달)을 표시하는 메시지를 표시합니다.

또한이 경우 페이지를 새로 고치지 않거나 Chrome 콘솔에 403 금지 메시지가 표시되기를 원하지 않습니다.

나는 그것이 실제로 많은 질문/만약 길고하지만 사전에 조언/팁 덕분에 알지 못합니다.

답변

1

당신은 error 핸들러에 HTTP 오류를 볼 수 있어야합니다 : 즉 서버에서 점점 HTTP 응답의로 당신은 항상 콘솔에 403을 볼 수

$.ajax({ 
    ... 
    error: function (xhr, ajaxOptions, thrownError) { 
     if(xhr.status==403) { 
      alert(...); 
     } 
    } 
} 

.

당신은 간단하게 할 수있는 test_func 불과합니다 : 프로덕션 환경에서

class AllUsersViews(UserPassesTestMixin, View): 
    ... 

    def test_func(self): 
     return self.request.user.is_superuser 

    ... 
+0

이 나쁜 연습 콘솔에서 (403)를 떠나거나 내가 이것을 달성하기 위해 다른 경로를 이동해야 할 것인가? 어쩌면 403 대신 장고에서 다른 유형의 메시지를 보냅니 까? –

+0

콘솔에서 제거하는 유일한 방법은 서버에서 전송하지 않는 것입니다. 많은 브라우저에서 어떤 경우에도 HTTP 오류를 표시합니다. 403을 보낼지 여부는 응용 프로그램에 따라 다릅니다. 제 생각에는 401이 누락 된 자격 증명에 더 적합하다고 생각합니다. 403은 일반적으로 클라이언트 응용 프로그램이 액세스해서는 안되는 것을 시도한다는 것을 의미합니다. –

+0

Allright가 UserPassesTestMixin의 "handle_no_permission"을 무시하고 같은 페이지로 리다이렉트를 리턴하지만 django 프레임 워크에 "message"를 추가했습니다. –