代码之家  ›  专栏  ›  技术社区  ›  ground5hark

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

  •  6
  • ground5hark  · 技术社区  · 14 年前

    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,因为它没有被显式传递到 requires_login 定义。

    到底是怎么回事 纽维视图 接收这些参数的定义?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Wesley    14 年前

    怎么用? new_view 作品

    让我们先看看 纽维视图 功能:

    def new_view(request, *args, **kwargs):
        if not request.user.is_authenticated():
            return HttpResponseRedirect('/accounts/login/')
        return view(request, *args, **kwargs)
    

    什么时候? 新视图 调用时,它检查用户是否经过身份验证。如果用户已通过身份验证,则 纽维视图 电话 view 把所有的论点( request ,位置参数和关键字参数)。

    定义新视图

    纽维视图 不会自动执行。我们正在使用 def 定义函数,但我们不会立即执行它。相反,我们回来了 纽维视图 作为一个函数。想象一下下面的代码:

    def my_view(request):
        # ... some view stuff happens here
    
    my_new_view = requires_login(my_view)
    

    现在, my_new_view 是一个函数。我可以像其他函数一样调用它。到目前为止,还没有实际调用这个新函数。

    什么时候? MyoNeNexVIEW 调用,它接收所有参数。然后调用 my_view ,传递所有参数( 请求 ,位置参数和关键字参数)到 米亚维尤 相反。

    (当然,所有这些都假定用户是经过身份验证的。否则,当你打电话时 MyoNeNexVIEW 你会得到一个 HttpResponseRedirect 米亚维尤 不会被召唤。)

    看法 作为一个论点

    requires_login 接收调用的函数 看法 作为它的论点。 看法 引用一个函数,但我们还没有执行该函数。 看法 只有在 纽维视图 执行。