添加调度装饰器

时间:2011-07-06 23:43:54

标签: django django-views decorator

我有以下视图功能:

def gettingstarted_info(request): 
    """
    First page of gettingstarted after Registration.
    """
    if request.user.is_authenticated():
        if request.user.get_profile().getting_started_boolean: 
             return redirect('/home/')                       
        else:
            user = request.user
    else:
        username = request.session.get('username', False)                                                   
        if not username:
            return redirect('/login')                
        else:
            user = User.objects.get(email=username)  
    # the main part of the view function #

我想将视图函数的第一部分转换为@ decorator,所以我可以使用类似的东西 -

@gettingstarted_dispatch
def getting_started_info(request):
    # the main part of the view function

我看了一下装饰器函数的文档,但转换函数有点困难,所以我可以用它作为@装饰器。装饰者应该过滤掉未经授权的个人并返回user变量(注意这与request.user不同)。我该怎么做?谢谢。

1 个答案:

答案 0 :(得分:1)

我认为这个功能应该适合你。 :)

def gettingstarted_dispatch(f):
    def wrap(request, *args, **kwargs):
        if request.user.is_authenticated():
            if request.user.get_profile().getting_started_boolean:
                return redirect('/home/')
            else:
                user = request.user
        else:
            username = request.session.get('username', False)
            if not username:
                return redirect('/login')
            else:
                user = User.objects.get(email=username)
        kwargs['user'] = user
        return f(request, *args, **kwargs)
    return wrap

该函数将用户变量作为user关键字arg。

传递

或者,如果您愿意,请将用户作为第二个arg ......

            else:
                user = User.objects.get(email=username)
        return f(request, user, *args, **kwargs)
    return wrap

此外,这是一个关于如何做装饰器的深度教程。 :)

(第一部分)http://www.artima.com/weblogs/viewpost.jsp?thread=240808
(第二部分)http://www.artima.com/weblogs/viewpost.jsp?thread=240845
(第三部分)http://www.artima.com/weblogs/viewpost.jsp?thread=241209