gpt4 book ai didi

django - Basic Django - View 包装器如何接收请求、关键字和位置参数?

转载 作者:行者123 更新时间:2023-12-04 15:27:59 25 4
gpt4 key购买 nike

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

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究竟是怎样的定义接收这些参数?

最佳答案

如何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 时执行被执行。

关于django - Basic Django - View 包装器如何接收请求、关键字和位置参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2294686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com