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

发布于 2024-08-01 12:43:05 字数 86 浏览 2 评论 0原文

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

谢谢。

How can make Django permission_required decorator not to redirect already logged-in users to login page, but display some message like Insufficient permissions?

Thank you.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

淡水深流 2024-08-08 12:43:05

由于 django 1.4 permission_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)

Ref:permission_required 装饰器文档

Since django 1.4 permission_required has a raise_exception parameter that you can set to True to have an unauthorized PermissionDenied exception raised

Eg. to give an exemple on a Class Based View:

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)

Ref:permission_required decorator doc

°如果伤别离去 2024-08-08 12:43:05

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

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

A quick and dirty solution would be to write your own decorator to do this. Something like this:

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

You can then decorate your view thus:

@custom_permission_required('my_perm')
def my_view(request, *args, **kwargs):
    #Do stuff
嗫嚅 2024-08-08 12:43:05

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

You can write your own decorator to replace django's permission_required decorator:

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)

And use it the same way:

@permission_required('app.permission')
def view_page(request):
    # your view function

Logged in users with no permission will get a 403 forbidden error. Those who are not logged in will be redirected to the login page.

一绘本一梦想 2024-08-08 12:43:05

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

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

@Manoj Govindan 的答案和 @Stefano 的答案都不会工作。 @Lidor 的答案是可行的,但他已经完全重新实现了permission_required 函数。

这是一个更简单的方法:

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

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

I'm assuming this question requires two pieces

  • Users that are already logged in do not get redirected to the login page
  • Users that are not logged in do not get redirected

@Manoj Govindan's answer nor @Stefano's answer will not work. @Lidor's answer will work, but he has fully re-implemented the permission_required function.

Here is a simpler way:

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

With this, if the user is not logged in, they will be redirected. If they are but they don't have permissions, they will be down an error.

仅冇旳回忆 2024-08-08 12:43:05

您可以向装饰器添加参数“login_url”:

@permission_required("my_app.add_user", login_url="url_name")

You can add a parameter "login_url" to the decorator:

@permission_required("my_app.add_user", login_url="url_name")
混吃等死 2024-08-08 12:43:05

我遇到了同样的问题,但在 @permission_required 装饰器中了解了 raise_exception 参数!
该参数默认为False,但是一旦您将True值传递给它,它将自动将未经许可的用户重定向到403.html页! (如果你的项目根目录下有403.html页面,否则显示服务器403禁止页面!
在此处阅读 Django 文档的更多内容

@permission_required('app_name.view_model', raise_exception=True)
    def some_model_view(request):
        ...

I had the same problem but learned about raise_exception parameter at the @permission_required decorator!
this parameter is False by default, but once you pass it the True value, it will automatically redirect the without permission user to the 403.html page! (if there was any 403.html page in the root of your project, otherwise shows the server 403 forbidden page!
read more in Django docs here

@permission_required('app_name.view_model', raise_exception=True)
    def some_model_view(request):
        ...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文