0

這是我的觀點:基於DjangoRestFramework/Django的類視圖 - 如何使它重定向到登錄頁面,如果403引發錯誤

# This view is accessed by going to "/CMS/app" 
class AppPageView(TemplateView): 
    template_name = "app.html" 

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

# This view is accessed by going to "/user/:user_id" 
class user_detail(APIView): 
    """ 
    Get, update or delete a specific user. 
    """ 
    permission_classes = (IsAuthenticated,) 

    def get_object(self, pk): 
     try: 
      return User.objects.get(pk=pk) 
     except User.DoesNotExist: 
      raise Http404 

    def get(self, request, pk): 
     user = self.get_object(pk) 
     serializer = UserSerializer(user) 
     return Response(serializer.data) 

當我轉到他們的網址訪問這兩個的這些觀點,我得到默認DjangoRestFramework網頁,其中說:

User Detail 
Get, update or delete a specific user. 

GET /CMS/users/8 
HTTP 403 FORBIDDEN 
Content-Type: application/json 
Allow: GET, PUT, DELETE, HEAD, OPTIONS 
Vary: Accept 

{ 
    "detail": "Authentication credentials were not provided." 
} 

是否有可能爲我改變它,這樣不是顯示默認的DRF頁面,使其重定向到登錄頁面? (登錄頁面的URL是「/ login」)。

注:我使用的是Django的TemplateView一個視圖和DRF APIView其他的,但都重定向到DRF默認的403頁,當我試圖訪問其網址不被記錄在

+2

API對於重定向沒有任何意義。 API供開發人員使用,它們在應用程序內部,重定向在瀏覽器使用該應用程序時使用,以便人員可以填寫詳細信息。 API應該引發一個錯誤(這正是它正確的做法)。 –

+0

@BurhanKhalid當我通過使用AngularJS執行$ http.get(「/ CMS/users/8」)嘗試GET請求時,我確實希望它返回帶有JSON消息的403。但是,如果用戶使用他們的Web瀏覽器直接訪問URL,我不希望顯示默認的DRF頁面(我擔心的是,我不希望最終用戶意外地在DRF頁面上顯示「HTTP 403 FORBIDDEN Content-Type:application/json允許:GET,PUT,DELETE,HEAD,OPTIONS Vary:Accept「,因爲他們會感到困惑)。我能爲我的擔憂做些什麼?能以某種方式顯示簡單的「403點擊此處登錄」頁面嗎? – user2719875

+1

我想你真正問的問題是 - 我如何檢測用戶輸入的URL或來自Angular? –

回答

1

你可以將TemplateHTMLRenderer添加到您的view renderer_classes中,這將使您能夠在用戶轉到url並且用戶未通過身份驗證時使用django 403.html模板。 http://www.django-rest-framework.org/api-guide/renderers/#templatehtmlrenderer

class user_detail(APIView): 
    """ 
    Get, update or delete a specific user. 
    """ 
    permission_classes = (IsAuthenticated,) 
    # Add TemplateHTMLRenderer to your view renderer_classes 
    renderer_classes = (JSONRenderer, TemplateHTMLRenderer) 

    def get_object(self, pk): 
     try: 
      return User.objects.get(pk=pk) 
     except User.DoesNotExist: 
      raise Http404 

    def get(self, request, pk): 
     user = self.get_object(pk) 
     serializer = UserSerializer(user) 
     return Response(serializer.data) 
+0

正如BurhanKhalid所說,我不想將我的RESTful API/Views更改爲任何地方。我認爲最好的做法是如您在評論中提到的那樣製作自己的自定義403.html頁面。您認爲哪個選項對於RESTful API更好? (要重定向到登錄URL或創建我自己的自定義403。html頁面上寫着「點擊這裏登錄」?) – user2719875

+0

@ user2719875我只是保留默認視圖,但如果你擔心有人不小心去了網址,你可以設置自定義模板。我不會推薦做重做,因爲這是來自休息服務的意外行爲。 –

+0

啊,好的,謝謝。您可以編輯您的答案以包含「設置自定義模板」部分,並將其標記爲答案。 – user2719875

相關問題