Basic Django - 视图包装器如何接收请求,关键字和位置参数?

时间:2010-02-19 07:25:58

标签: django django-models django-admin django-templates django-views

chapter 8Django book中有一个示例显示了一个基本的视图换行方法,它接收从任意单个任意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因为它没有被明确地传递给{{1定义。

requires_login定义接收这些参数究竟是什么?

1 个答案:

答案 0 :(得分: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时执行。