了解 wagtail 源代码中的 page.route()

Understanding page.route() in wagtail source code

wagtail.core.views.py,

def serve(request, path):
    # we need a valid Site object corresponding to this request in order to proceed
    site = Site.find_for_request(request)
    if not site:
        raise Http404

    path_components = [component for component in path.split('/') if component]
    page, args, kwargs = site.root_page.localized.specific.route(request, path_components)
...
    return page.serve(request, *args, **kwargs)

page, args, kwargs = site.root_page.localized.specific.route(request, path_components) 将调用 wagtail.core.models.page.route(), which will further invoke RouteResult.__init__() in wagtail.core.url_routing.py.

问:为什么page, args, kwargs会被route()一起返回?

根据源代码,args, kwargs 应该总是 None。我在处理过程中的任何地方都没有看到我们为 args, kwargs.

传递了任何参数

对于通过基本 Page.route 方法处理的普通页面,argskwargs 将始终为空,是的 - 在这种情况下,[=13 的工作=]方法只是简单的找到正确的Page对象来处理请求,Page对象是唯一需要返回的东西。

但是,特定页面类型可以覆盖 route 以在页面路由期间获取额外数据 - 这将作为附加参数传递给 serve 方法。 wagtail.contrib.routable_page app uses this technique - it overrides the route method 匹配页面模型上定义的任何 URL 路由。然后 returns 匹配的视图函数,以及来自 URL.

的任何额外参数