如何在自定义Pinax安装上修改Django的login_required装饰器?

时间:2016-06-06 20:06:03

标签: python django pinax

我想让Django的@login_required装饰器测试User上的特定字段是否已设置为None以外的其他字段。 (添加的字段为null = true,默认值为None。)

新创建的User对象确实对该字段的值为None,但对@login_required的明显更改在行为上没有明显区别(我重新启动了Gunicorn以确保新读取)。如果用户经过身份验证,则会呈现@login_required个视图,即使添加的字段为“无”。

目前略有变化的@login_required是:

def login_required(function=None, redirect_field_name=REDIRECT_FIELD_NAME):
    """
    Decorator for views that checks that the user is logged in, redirecting
    to the log-in page if necessary.
    """
    actual_decorator = user_passes_test(
        lambda u: u.foo != None,
        redirect_field_name=redirect_field_name
    )
    if function:
        return actual_decorator(function)
    return actual_decorator

原始的lambda在u.is_authenticated()

1 个答案:

答案 0 :(得分:2)

我从您的代码中看到,您实际遇到了user_passes_test,这实际上是您应该使用的,而不是直接修改login_required的源代码。

  

user_passes_test()接受一个必需的参数:一个带有a的callable   用户对象,如果允许用户查看页面,则返回True。   请注意,user_passes_test()不会自动检查   用户不是匿名的。

您只需创建一个确保满足条件的功能。这样可以确保所有内容都保留在代码库中(对django的更新不会破坏您的应用程序)并使调试变得更加容易。

您的测试功能可能是。

def is_foo(user):
   if user.is_authenticated() and user.foo :
       return True