了解 wagtail 源代码中的 page.route()
Understanding page.route() in wagtail source code
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
方法处理的普通页面,args
和 kwargs
将始终为空,是的 - 在这种情况下,[=13 的工作=]方法只是简单的找到正确的Page对象来处理请求,Page对象是唯一需要返回的东西。
但是,特定页面类型可以覆盖 route
以在页面路由期间获取额外数据 - 这将作为附加参数传递给 serve
方法。 wagtail.contrib.routable_page app uses this technique - it overrides the route
method 匹配页面模型上定义的任何 URL 路由。然后 returns 匹配的视图函数,以及来自 URL.
的任何额外参数
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
方法处理的普通页面,args
和 kwargs
将始终为空,是的 - 在这种情况下,[=13 的工作=]方法只是简单的找到正确的Page对象来处理请求,Page对象是唯一需要返回的东西。
但是,特定页面类型可以覆盖 route
以在页面路由期间获取额外数据 - 这将作为附加参数传递给 serve
方法。 wagtail.contrib.routable_page app uses this technique - it overrides the route
method 匹配页面模型上定义的任何 URL 路由。然后 returns 匹配的视图函数,以及来自 URL.