django 403 forbidden - redirect to login -
how can redirect user login page when confronted 403 forbidden?
consider following code:
urls.py
router = routers.defaultrouter() router.register(r'users', views.userviewset) urlpatterns = patterns('', url(r'^', include(router.urls)), ) views.py
class userviewset(viewsets.modelviewset): queryset = user.objects.all() serializer_class = userserializer renderer_classes = (renderers.jsonrenderer, renderers.templatehtmlrenderer) template_name='rest_framework/users.html' def list(self, request, *args, **kwargs): response = super(viewset, self).list(request, *args, **kwargs) if request.accepted_renderer.format == 'html': return response({'request':request, 'queryset': response.data['results']}) return response if visit /domain/users while not logged in, i'll 403 forbidden error. instead, redirect login page. in other words, never show 403 errors instead redirect directly login page.
i have tried putting:
@login_required def list(...): but not work. assume because inside viewset.
i have tried:
def list(...): if not request.user.is_authenticated(): return render_to_response('domain/login.html') but again, doesn't work.
i tried various 403middlewares no avail.
i tried redirecting via handler403 handler in urls.py
handler403 = 'site.views.login' no success.
what do?
django version: 1.5.4
you can't use standard login_required decorator on class method. have either wrap as_view() when use in url:
url(r'...', login_required(userviewset.as_view())) or wrap decorator django.utils.decorators.method_decorator , apply class dispatch method:
from django.utils.decorators import method_decorator django.contrib.auth.decorators import login_required class userviewset(viewsets.modelviewset): ... @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): .... (see https://docs.djangoproject.com/en/dev/topics/class-based-views/intro/#decorating-class-based-views)
for class-based views can incorporate reusable permissionrequiredmixin - see https://stackoverflow.com/a/6455140/839875
alternatively can raise django.core.exceptions.permissiondenied exception django catch django.views.defaults.permission_denied
(see https://docs.djangoproject.com/en/1.5/topics/http/views/#the-403-http-forbidden-view)
Comments
Post a Comment