基于 DjangoRestFramework / Django Class 的视图 - 如果出现 403 错误,如何使其重定向到登录页面
DjangoRestFramework / Django Class Based Views - How to make it redirect to login page if 403 error is raised
这些是我的观点:
# 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 页面。
您可以将 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)
这些是我的观点:
# 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 页面。
您可以将 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)