如何在django python中实现面向方面的编程

如何在django python中实现面向方面的编程,python,django,signals,Python,Django,Signals,我正在使用django,我有非常复杂的权限矩阵。假设我有10组权限组,如 Permissions=[基本、中等、高级、非常高级、管理员、超级管理员、公共等] 另一件事是我有10个模型,所有模型对每个组都有不同的查看、编辑权限,因此总体上规则变成了marix of10 X 10和更多 我现在拥有所有代码,没有权限。我真的不想在任何地方都使用当前代码进行权限检查 我需要在以下地方进行许可检查 权限将基于登录的用户权限组 在模板中,我们将根据权限显示“编辑”、“插入”、“删除”按钮 在显示前的视图中,

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

Permissions=[基本、中等、高级、非常高级、管理员、超级管理员、公共等]

另一件事是我有10个模型,所有模型对每个组都有不同的
查看、编辑
权限,因此总体上规则变成了marix of
10 X 10
和更多

我现在拥有所有代码,没有权限。我真的不想在任何地方都使用当前代码进行权限检查

我需要在以下地方进行许可检查

权限将基于登录的用户权限组

  • 在模板中,我们将根据权限显示“编辑”、“插入”、“删除”按钮
  • 在显示前的视图中,检查用户是否可以查看/更新/删除它
  • 在显示
    删除、更新、插入
    的任何视图之前,系统是否会自动检查权限矩阵,而无需在视图中写入任何代码


    那么剩下的就只有模板了,如果需要的话可以编写了

    我相信您只是在模板中查找Django提供的permissions变量

    在视图中,您可以使用

    它们看起来像这样:

    from django.contrib.auth.decorators import login_required
    
    @login_required
    def my_view(request):
        ...
    
    @login_required
    @group_required('A', 'B')
    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 login_required
    
    @login_required
    def my_view(request):
        ...
    
    @login_required
    @group_required('A', 'B')
    def my_view(request):
        ....
    
    要在模板中使用,可以定义自己的模板标记:

    from django import template
    
    register = template.Library()
    
    
    @register.filter
    def multiply(value, arg):
        return (value * arg)
    

    但是,如果不在视图中检查权限,我如何在视图中检查它呢。我想在其他地方定义一个函数,用于检查每个视图/编辑/升级/删除内容的permission。这种类型的检查可以在任何地方进行,例如,您可以在url定义中添加一个简单的包装器。只要您能够以某种方式确定将在哪个视图中编辑哪个对象,您就可以始终阻止它。如果你真的需要它,它甚至可以在一个中间件中完成。你能给我一个中间件的例子吗,我们如何做?我已经添加了一个例子,但如果没有进一步的细节,它就没那么有用了。
    from django import template
    
    register = template.Library()
    
    
    @register.filter
    def multiply(value, arg):
        return (value * arg)