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 - 视图包装器如何接收请求、关键字和位置参数?的主要内容,如果未能解决你的问题,请参考以下文章
Mailchimp python 包装器给出错误 - 没有会话
为自定义包装器视图添加示例视图到 PreviewProvider
如何从 django 视图发送 json 并在 HTML 上接收它
包装第 3 方 Django 应用程序的视图时出错? (Facebook、django-socialregistration、django-profiles)