在chapter 8的Django 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
定义接收这些参数究竟是什么?
答案 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
不会自动执行。我们使用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
时执行。