我怎样才能在django python中使用面向方面编程的东西

时间:2013-04-14 00:28:22

标签: python django signals

我正在使用django,我拥有非常复杂的权限矩阵。假设我有10组权限组,如

Permissions = [basic, medium, advanced , very advanced , admin , superadmin , public , etc]

另一个是我有10个模型,所有模型对每个组都有不同的view, edit权限,所以整个规则变成了10 X 10及更多的marix。

我现在所有的代码都没有权限。我真的不想在所有地方触摸当前代码以进行权限检查。

我需要在以下地点进行权限检查

permssions将基于登录用户权限组

  1. 在模板中,我们将根据权限显示编辑,插入,删除按钮
  2. 在显示之前的视图中,如果用户可以查看/更新/删除它,则会进行检查
  3. 有没有办法在显示delete,update,insert的任何视图之前,系统会自动检查权限矩阵而不在视图中编写任何代码。

    然后只剩下剩下的东西将出现在可以写入的模板中

2 个答案:

答案 0 :(得分:1)

我相信你只是在模板

中寻找由Django提供的权限变量

https://docs.djangoproject.com/en/1.5/topics/auth/default/#permissions

{% if perms.foo %}
    <p>You have permission to do something in the foo app.</p>
    {% if perms.foo.can_vote %}
        <p>You can vote!</p>
    {% endif %}
    {% if perms.foo.can_drive %}
        <p>You can drive!</p>
    {% endif %}
{% else %}
    <p>You don't have permission to do anything in the foo app.</p>
{% endif %}

示例中间件:

from django import http

class PermissionMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        # you should somehow derive this from the view function and/or view args/kwargs
        your_object = SomeThing.objects.get(...)

        if not request.user.has_perm('name_of_your_object.permission'):
            return http.HttpResponseForbidden()

答案 1 :(得分:0)

在视图中,您可以使用permission decorators

它们看起来像这样:

transform: translate3D(0,0,0.5px)

或者,除了登录以外,还需要其他权限:

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

如果您需要更复杂的场景(这些是我为自己制作的场景),您还可以定义自己的装饰器:

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote')
def my_view(request):
    ...

...并像这样使用它们:

from django.contrib.auth.decorators import user_passes_test
from django.core.exceptions import PermissionDenied


def group_required(*group_names):
    """Requires user membership in at least one of the groups passed in."""

    def in_groups(u):
        if u.is_authenticated:
            if u.groups.filter(name__in=group_names).exists() | u.is_superuser:
                return True
        return False
    return user_passes_test(in_groups)


def superuser_only(function):
    """Limit view to superusers only."""

    def _inner(request, *args, **kwargs):
        if not request.user.is_superuser:
            raise PermissionDenied
        return function(request, *args, **kwargs)
    return _inner


def has_group(user, group_name):
    return user.groups.filter(name=group_name).exists()

要在模板中使用,您可以定义自己的模板标签:

@login_required
@group_required('A', 'B')
def my_view(request):
    ....