6

Django book的第 8 章中,有一个示例显示了一个基本的视图包装方法,它接收从任何单个任意 URLconf 传入的另一个视图方法:

def requires_login(view):
    def new_view(request, *args, **kwargs):
        if not request.user.is_authenticated():
            return HttpResponseRedirect('/accounts/login/')
        return view(request, *args, **kwargs)
    return new_view

我遵循这里的大部分逻辑,但我不明白嵌套new_view定义是如何接收请求的,*args 和 **kwargs 因为它没有被显式传递到requires_login定义中。

定义究竟是如何new_view接收这些论点的?

4

1 回答 1

4

new_view工作原理

我们先来看看new_view函数:

def new_view(request, *args, **kwargs):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('/accounts/login/')
    return view(request, *args, **kwargs)

new_view被调用时,它会检查用户是否通过了身份验证。如果用户通过身份验证,则new_view调用view并传递所有参数(request、位置参数和关键字参数)。

定义 new_view

new_view不会自动执行。我们正在使用def来定义函数,但我们并没有立即执行它。相反,我们new_view作为函数返回。想象一下下面的代码:

def my_view(request):
    # ... some view stuff happens here

my_new_view = requires_login(my_view)

现在,my_new_view是一个函数。我可以像调用任何其他函数一样调用它。到目前为止,还没有实际调用过这个新函数。

my_new_view被调用时,它接收它的所有参数。然后它调用my_view,将所有参数(request、位置参数和关键字参数)传递给my_view

(当然,所有这些都假定用户已通过身份验证。否则,当您调用 时my_new_view,您将得到一个HttpResponseRedirect,并且my_view永远不会被调用。)

view作为论据

requires_login接收一个view作为其参数调用的函数。view指的是一个函数,但我们还没有执行那个函数。view仅在执行时new_view执行。

于 2010-02-19T07:43:52.837 回答