Python 使用视图装饰器处理用户权限是一种错误的做法吗?

Python 使用视图装饰器处理用户权限是一种错误的做法吗?,python,django,security,Python,Django,Security,我正在使用Django视图装饰程序以一种相当复杂的方式检查权限,我开始意识到这可能是一种不好的做法 给定用户的配置文件处于特定状态,比如“应用程序挂起”,因此某些视图不应显示给该用户,而应显示给具有“应用程序完成”的用户。我目前正在使用decorators将挂起的用户重定向到主页,弹出窗口告诉他们他们的应用程序仍然挂起 然而,我读到,装饰器应该简单,不依赖于数据库连接、文件等 这是否意味着在显示视图之前检查借款人应用程序的状态是一种不好的做法,如果是,还有什么替代方法?在Django中,使用用户

我正在使用Django视图装饰程序以一种相当复杂的方式检查权限,我开始意识到这可能是一种不好的做法

给定用户的配置文件处于特定状态,比如“应用程序挂起”,因此某些视图不应显示给该用户,而应显示给具有“应用程序完成”的用户。我目前正在使用decorators将挂起的用户重定向到主页,弹出窗口告诉他们他们的应用程序仍然挂起

然而,我读到,装饰器应该简单,不依赖于数据库连接、文件等


这是否意味着在显示视图之前检查借款人应用程序的状态是一种不好的做法,如果是,还有什么替代方法?

在Django中,使用
用户通过测试
所需权限
装饰器是正确的做法

from django.contrib.auth.decorators import user_passes_test, permission_required

@user_passes_test(lambda user: user.is_superuser)
@permission_required('your_perm')
def my_view(request):
    # code

你提到的文本充其量是有争议的——至少在表述上是这样的:

避免decorator本身的外部依赖性(例如,不要依赖文件、套接字、数据库连接等),因为它们在decorator运行时可能不可用(在导入时,可能来自pydoc或其他工具)

(……)

装饰器是“顶级代码”的特例

这只适用于decorator函数的“外部”部分,而不是decorator返回的包装函数(通常)中的代码,即:

def mydecorator(func):
    print("""
       this is the outer decorator code 
       and will be executed when the decorator
       is applied (most often - but not necessarily
       - at import time)
       """
       )
       def wrapper(*args, **kw):
           print("""
              this is the inner decorator code     
              which is only executed when the
              decorated function is called,
              so here it's safe to do whatever
              you would do in the decorated function.
              """
              )
              return func(*args, **kw)
      return wrapper       

瞧,你所做的(在视图中使用decorators检查用户是否被允许访问内容)不仅是完美的,而且是decorators用途的一个典型例子,而且它甚至是Django中处理这一问题的官方方式,参见Davide Pizzolato的回答。

谢谢你,我现在明白我是怎么误读了。在这种逻辑变得相当复杂的情况下,如果提交了user.profile.application.而不是user.profile.contract.signed或user…..
,您是否可以推荐一种模式来避免类似
,或者是将这些布尔权限/用户状态值集中在用户模型本身上以维护干式原则等最简单的方法。抱歉,没有在你的评论中,这个问题的答案是一刀切的,因此需要更多的上下文来提供一些可能的解决方案。你可能想考虑把这个问题作为一个恰当的问题(尽可能多地给出上下文)。