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

Posted

技术标签:

【中文标题】Basic Django - 视图包装器如何接收请求、关键字和位置参数?【英文标题】:Basic Django - How do view wrappers receive the request, keyword and positional arguments? 【发布时间】:2011-01-18 16:15:06 【问题描述】:

在Django book 的chapter 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 定义究竟是如何接收这些参数的?

【问题讨论】:

【参考方案1】:

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

【讨论】:

宾果游戏,就是这样。我怎么没看到这个……?哈哈。现在完全有意义。谢谢! 很高兴这是有道理的。如果您还没有研究过 Python 装饰器,那么现在是个好时机。装饰器只是接受一个函数作为参数并返回一个函数的函数,就像这里的requires_login

以上是关于Basic Django - 视图包装器如何接收请求、关键字和位置参数?的主要内容,如果未能解决你的问题,请参考以下文章

如果视图在 Django 中失败,如何创建默认错误装饰器?

Mailchimp python 包装器给出错误 - 没有会话

为自定义包装器视图添加示例视图到 PreviewProvider

如何在带有上下文的 Django 中重定向?

如何从 django 视图发送 json 并在 HTML 上接收它

包装第 3 方 Django 应用程序的视图时出错? (Facebook、django-socialregistration、django-profiles)