如何使 Django permission_required 装饰器不将已登录的用户重定向到登录页面,而是显示一些诸如权限不足的消息?
谢谢你。
如何使 Django permission_required 装饰器不将已登录的用户重定向到登录页面,而是显示一些诸如权限不足的消息?
谢谢你。
一个快速而肮脏的解决方案是编写自己的装饰器来执行此操作。像这样的东西:
decorator_with_arguments = lambda decorator: lambda *args, **kwargs: lambda func: decorator(func, *args, **kwargs)
@decorator_with_arguments
def custom_permission_required(function, perm):
def _function(request, *args, **kwargs):
if request.user.has_perm(perm):
return function(request, *args, **kwargs)
else:
request.user.message_set.create(message = "What are you doing here?!")
# Return a response or redirect to referrer or some page of your choice
return _function
然后,您可以这样装饰您的视图:
@custom_permission_required('my_perm')
def my_view(request, *args, **kwargs):
#Do stuff
由于 django 1.4permission_required有一个raise_exception参数,您可以将其设置为 True 以引发未经授权的PermissionDenied异常
例如。以基于类的视图为例:
from django.contrib.auth.decorators import permission_required
...
class MyView(TemplateView):
@method_decorator(permission_required('can_do_something', raise_exception=True))
def dispatch(self, *args, **kwargs):
return super(MyView, self).dispatch(*args, **kwargs)
我假设这个问题需要两部分
@Manoj Govindan 的回答和@Stefano 的回答都不起作用。@Lidor 的回答会起作用,但他已经完全重新实现了该permission_required功能。
这是一个更简单的方法:
@login_required
@permission_required('hi there', raise_exception=True)
def blah(request):
pass
有了这个,如果用户没有登录,他们将被重定向。如果他们是但他们没有权限,他们将出错。
我有同样的问题,但在装饰器上了解了raise_exception参数 !@permission_required这个参数是False默认的,但是一旦你给它传递了True值,它会自动将未经许可的用户重定向到403.html页面!(如果403.html您的项目的根目录中有任何页面,否则显示服务器 403 禁止页面!
在此处阅读 Django 文档中的更多信息
@permission_required('app_name.view_model', raise_exception=True)
def some_model_view(request):
...
您可以编写自己的装饰器来替换 django 的permission_required装饰器:
from django.utils import six
from django.core.exceptions import PermissionDenied
from django.contrib.auth.decorators import user_passes_test
def permission_required(perm, login_url=None, raise_exception=True):
def check_perms(user):
if isinstance(perm, six.string_types):
perms = (perm, )
else:
perms = perm
if user.has_perms(perms):
return True
if raise_exception and user.pk:
raise PermissionDenied
return False
return user_passes_test(check_perms, login_url=login_url)
并以同样的方式使用它:
@permission_required('app.permission')
def view_page(request):
# your view function
没有权限登录的用户会收到 403 禁止错误。未登录的用户将被重定向到登录页面。