2016-10-06 11 views
0

これは、DjangoではなくAJAXでGETリクエストを処理しようとしているので、403 Forbidden(Given by Django)が呼び出されたときにjQueryで簡単なポップアップ/モーダルを表示できます。AjaxでDjangoからPermissionDenied(403)を取得するには?

これはリクエスト扱い私Javasscriptです:

はちょうど私のhtmlのボタンを取得し、Clickイベントを待機します。

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) 

だから、今、イム私は私がしたいページにリダイレクトんが、スーパーユーザは、私ができるようにしたい場合基本的には、PermissionForbiddenがDjangoによって提起された場合、それらが許可を持っていないというメッセージをユーザに表示します(ポップアップまたはモーダル)。

また、このような場合にページを更新したくない、またはChromeコンソールに403 Forbidden Messageが表示されないようにしてください。

私はそれが実際にたくさんあるかどうか知っていません/もし長いが、事前に任意のアドバイス/チップのおかげで。

答えて

1

あなたはerrorハンドラでHTTPエラーが表示されるはずです:

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

それはあなたがサーバから取得しているHTTPレスポンスだとしてあなたは常にコンソールに403が表示されます。

あなただけにtest_funcを簡素化することができます:本番環境では

class AllUsersViews(UserPassesTestMixin, View): 
    ... 

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

    ... 
+0

コンソールに403を残すのは悪い習慣でしょうか、私はこれを達成するために、別のルートを行くべき?多分、403の代わりにDjangoから他のタイプのメッセージを送信していますか? –

+0

コンソールから削除する唯一の方法は、サーバーから送信することではなく、多くのブラウザでHTTPエラーが表示されるためです。 403を送信するかどうかは、アプリケーションによって異なります。 401は、資格情報が欠落している方が適切だと思います。 403は、一般に、クライアントアプリケーションがアクセスすべきでないものにアクセスしようとしていることを意味します。 –

+0

AllrightはUserPassesTestMixinの "handle_no_permission"をオーバーライドし、同じページにリダイレクトを返すだけで、djangoフレームワークで "message"を追加しました。 –

関連する問題