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