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

相关问题