0

这些是我的看法:

# 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)

当我通过访问它们的 URL 访问这些视图中的任何一个时,我会得到默认的 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 用于另一个视图,但是当我尝试在未登录的情况下访问其 URL 时,两者都重定向到 DRF 默认 403 页面。

4

1 回答 1

1

您可以将 TemplateHTMLRenderer 添加到您的视图 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)
于 2015-09-28T06:36:44.703 回答