Django:我们可以设置使用应用程序的权限吗?

12 浏览
0 Comments

Django:我们可以设置使用应用程序的权限吗?

在我的Django网站中,我有几个应用程序,每个应用程序只能由特定的用户组使用。假设我有2个用户组:A和B。我有两个应用程序:App1,其URL以/app1开头,和App2,其URL以/app2开头。我想将使用App1的权限分配给A组,将使用App2的权限分配给B组。来自B组的用户永远无法访问以/app1开头的所有URL,反之亦然。\n我该如何实现?

0
0 Comments

问题的出现的原因:作者推荐不要在Django中为应用程序设置权限,而是建议在实现App1和App2的视图上使用user_passes_test()或permission_required()装饰器。

解决方法:可以通过为每个应用程序创建一个单独的视图,并使用urlconf来处理剩余的URL参数。然后,在视图中手动运行user_passes_test()来检查权限,并解析剩余的URL参数来确定下一步的操作。

然而,这种解决方法需要手动解析和分派操作,而这恰恰是Django中的urlconf的作用。可以创建另一个特定于应用程序的urlconf,并手动使用其API将剩余的URL参数重定向到一组视图。

原因:作者没有详细说明不建议为应用程序设置权限的原因。

0
0 Comments

Django: 我们可以设置使用应用程序的权限吗?

在给定的答案中,以下是将一个应用程序的所有现有权限添加到一个组中的代码。

例如,如果你有 App1 和 App2,并且你想自动创建两个名为 app1 和 app2 的组,分别包含每个应用程序的模型的权限,请尝试以下代码:

对于 App1 中的 apps.py 文件:

from django.apps import AppConfig
from django.db.models.signals import post_migrate
class App1Config(AppConfig):
    name = 'app1'
    def ready(self):
        from .signals import populate_models
        post_migrate.connect(populate_models, sender=self)

创建一个 signals.py 文件,其中包含以下内容:

def populate_models(sender, **kwargs):
    from django.apps import apps
    from .apps import App1Config
    from django.contrib.auth.models import Group, Permission
    from django.contrib.contenttypes.models import ContentType
    group_app, created = Group.objects.get_or_create(name=App1Config.name)
    models = apps.all_models[App1Config.name]
    for model in models:
        content_type = ContentType.objects.get(
            app_label=App1Config.name,
            model=model
        )
        permissions = Permission.objects.filter(content_type=content_type)
        group_app.permissions.add(*permissions)

对于 App2 也是类似的操作。

然后将用户分配到他们所在的组中。

使用方法:

在每个应用程序中创建一个名为 permissions.py 的文件,并添加以下内容:

from .apps import App1Config
def is_in_group_app1(user):
    return user.groups.filter(name=App1Config.name).exists()

在 views.py 中使用:

from django.contrib.auth.decorators import login_required, user_passes_test
from .permissions import is_in_group_app1
@login_required(login_url='where_to_redirect')
@user_passes_test(is_in_group_app1)
def myview(request):
    # Do your processing

对于 CBV:

@method_decorator(user_passes_test(is_in_group_app1), name='dispatch')
class LogListView(ListView):
    """ Displays all logs saved on App1 """
    model= Logger.objects.order_by('-date_created')

创建一个名为 templatestag 的文件夹和子文件夹 app1,并在其中创建一个 has_perms.py 文件:

from django import template
from app1.permissions import is_in_group_app1
register = template.Library()
@register.filter
def has_perms(user):
    return is_in_group_app1(user)

在你的模板中:

{% load has_perms %}
{% if request.user|has_perms %}
    
{% endif %}

我花了一些时间来找到这个过程,所以如果它可以帮助其他人:

祝你玩得开心!

0