【问题标题】:Adding a dispatch decorator添加调度装饰器
【发布时间】:2011-07-06 23:43:54
【问题描述】:

我有如下视图函数:

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 #

我想将视图函数的第一部分转换为 @ 装饰器,所以我可以有类似 --

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

我查看了有关装饰器函数的文档,但在转换函数时遇到了一些困难,因此我可以将其用作 @ 装饰器。装饰器应过滤掉未经授权的个人并返回user 变量(注意这与request.user 不同)。我该怎么做?谢谢。

【问题讨论】:

    标签: django django-views decorator


    【解决方案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 传递。

    或者,如果您愿意,可以将 user 作为第二个参数...

                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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 2022-12-03
      相关资源
      最近更新 更多