装饰login_required Django装饰器

时间:2015-08-24 16:34:09

标签: python django django-authentication python-decorators

我正在尝试装饰login_required Django装饰器。我一直在看这个问题decorating decorators: try to get my head around understanding it。但是,这种情况有点不同,因为我不想修改login_required装饰器而是为它添加更多功能。

要清楚,我正在尝试创建一个装饰器来装饰一个视图函数(第一个参数是正常的请求)并检查用户参数。如果可能的话,我不想像Django: Tweaking @login_required decorator那样创建我自己的装饰器版本,因为我认为这是一种可能在将来修改的安全关键方法。

这是我到目前为止所得到的,但它无效。

from django.conf import settings
from django.contrib.auth.decorators import login_required, REDIRECT_FIELD_NAME
from django.http.response import HttpResponseRedirect
from django.utils.decorators import available_attrs
from functools import wraps


def login_and_def_pass_required(view_function=None, redirect_field_name=REDIRECT_FIELD_NAME, login_url=None):
    def decorate_view(view_function):
        @wraps(view_function, assigned=available_attrs(view_function))
        def _double_wrapped_view(request, *args, **kwargs):
            actual_decorator = login_required(view_function, redirect_field_name, login_url)
            if request.user.temporary_password:
                return HttpResponseRedirect(settings.SET_PERMANENT_PASSWORD_URL)
            return actual_decorator
        return _double_wrapped_view
    return decorate_view

这引发了异常“'function'对象没有属性'get'”。

我正在使用Django 1.8.4 Python 3.4

1 个答案:

答案 0 :(得分:1)

您可以与login_required合作使用user_passes_test来实现所需的行为:

def check_permanent_password(user):
    return not user.temporary_password

@login_required(login_url)
@user_passes_test(check_temporary_password, login_url=settings.SET_PERMANENT_PASSWORD_URL)
def view(request):
    # your view