Django-如何查看使用自定义装饰器包装视图的所有权限

时间:2020-08-19 13:56:34

标签: django django-views django-permissions

我正在为系统编写测试,以尝试确保与视图相关联的所有权限都是准确的,并且对于实际上具有与其相关联的权限的用户而言是可访问的。我们曾经有过几次拼写错误的情况,因此视图无法访问,因此这就是我要测试的内容。

我的管理员用户始终具有与他们相关联的正确权限,因此自然地,确保将为管理员加载每个视图的最简单的解决方案是确保每个视图的权限装饰者的权限是存储在数据库中的有效权限,但是,似乎无法找到一种方法来获取URL,对其进行解析,然后查看与该视图实际关联的权限。

例如,这是一个简单的视图:

@permissions_required('prospects.view_prospect', 'prospects.change_prospects')
def prospects(request, client_url):
    return render(request, 'prospects/index.html', {})

这是装饰器@permissions_required

def permissions_required(*perms, raise_error=False):
    """
    Decorator for views that checks whether a user has a particular permission
    enabled, redirecting to the log-in page if necessary.
    """

    def check_perms(user):
        allowed = all([user.has_perm(perm) for perm in perms])
        if not allowed and raise_error:
            raise PermissionDenied
        return allowed

    return user_passes_test(check_perms)

我想知道此视图由权限包裹:

'prospects.view_prospect''prospects.change_prospects'

我该怎么做?


这是我用来尝试找到这些属性的代码,但是到目前为止,我还没有完全成功,所以我希望有一个清晰的方法来实现此目的:

app_name = 'prospects'
mod_to_import = f'apps.{app_name}.urls'
urls = getattr(importlib.import_module(mod_to_import), "urlpatterns")
for url in urls:
    print(url.__dict__)
    print(url.callback.__dict__)
    print(url.callback.__wrapped__)
    
# print(url.__dict__) returns this:
{'pattern': <django.urls.resolvers.RoutePattern object at 0x7fbd0c2c8520>, 'callback': <function prospects at 0x7fbd0c28ff70>, 'default_args': {}, 'name': 'prospects'}

# print(url.callback.__dict__) returns this:
{'__wrapped__': <function prospects at 0x7fd0642b1550>}


# print(url.callback.__wrapped__) returns this, but off from this I cannot seem to do anything else:
<function prospects at 0x7fd0642b1550>

0 个答案:

没有答案