我正在使用Django视图装饰器以相当复杂的方式检查权限,并且开始意识到这可能是不好的做法。
鉴于用户的个人资料处于某种状态,例如“应用程序待处理”,因此某些视图不应显示给该用户,而应显示给具有“应用程序完成”的用户。我目前正在使用装饰器将待处理的用户重定向到首页,并弹出一个窗口,告诉他们其应用程序仍在待处理。
但是,我在google's python best practice上读到,装饰器应该很简单,并且不依赖于数据库连接,文件等。
这是否意味着不好的做法,例如在显示视图之前检查借款人应用程序的状态,如果是,那有什么替代方法?
答案 0 :(得分:3)
在Django中,使用user_passes_test
或permission_required
装饰器是正确的方法。
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
答案 1 :(得分:1)
您提到的文本充其量是值得商-的-至少在其表述中:
避免装饰器本身的外部依赖关系(例如,不要依赖文件,套接字,数据库连接等),因为它们在装饰器运行时(在导入时,可能来自pydoc或其他工具)可能不可用。
(...)
装饰器是“顶级代码”的特例
这仅适用于装饰器函数的“外部”部分,不适用于装饰器返回的包装函数中的代码(通常),即:
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
IOW,您正在做的事情(在视图中使用装饰器检查用户是否被允许访问内容)不仅可以正常使用,而且是装饰器用途的规范示例,但它甚至是处理信息的正式方法这在Django中,请参阅Davide Pizzolato的答案。