15

如何使 Django permission_required 装饰器不将已登录的用户重定向到登录页面,而是显示一些诸如权限不足的消息?

谢谢你。

4

5 回答 5

12

一个快速而肮脏的解决方案是编写自己的装饰器来执行此操作。像这样的东西:

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
于 2009-08-09T20:32:07.493 回答
12

由于 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)

参考:permission_required 装饰器文档

于 2013-02-26T16:28:03.397 回答
1

我假设这个问题需要两部分

  • 已经登录的用户不会被重定向到登录页面
  • 未登录的用户不会被重定向

@Manoj Govindan 的回答和@Stefano 的回答都不起作用。@Lidor 的回答会起作用,但他已经完全重新实现了该permission_required功能。

这是一个更简单的方法:

@login_required
@permission_required('hi there', raise_exception=True)
def blah(request):
    pass

有了这个,如果用户没有登录,他们将被重定向。如果他们是但他们没有权限,他们将出错。

于 2017-05-30T23:46:20.997 回答
1

我有同样的问题,但在装饰器上了解了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):
        ...
于 2020-09-30T16:22:27.633 回答
0

您可以编写自己的装饰器来替换 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 禁止错误。未登录的用户将被重定向到登录页面。

于 2016-06-24T10:40:39.090 回答