概念与用例
容易理解,路由表的核心用处在于路由查找:根据用户请求的URL,找到匹配的视图函数:
不过有时候,我们也需要为视图函数生成对应的URL,这被称为URL的反向解析。
不过这有什么用呢,有什么用呢,什么用呢,么用呢,用呢,呢......
让我们看一个假想的案例。
假设你在负责一个信息系统的报表子系统的开发,而邮箱子系统是另外一个同事开发的,这两个 子系统的路由表,以及你的报表子系统的功能首页视图如下:
项目经理在将这些子系统部署到具体项目时,会分别挂接在不同的URL路径下。例如,将你 的报表子系统挂在/report/下,而将邮箱子系统挂在/email/下,这时,整个系统的URL 看起来是这样:
现在的问题来了:如果需要在你的报表子系统的首页,给用户提供到其收/发件箱的链接, 该怎么做?
看起来可能很简单,修改一下你的首页视图,加上邮箱的链接:
def v_index(req):
Body = '''
<h1>统计报表</h1>
<ul>
<li><a href="income/2012/">2012年度收入报表</a></li>
<li><a href="income/2012/12/">2012-12月度收入报表</a></li>
<li><a href="/email/inbox/">收件箱</a></li>
<li><a href="/email/outbox/">发件箱</a></li>
</ul>
'''
return HttpResponse(body)
如果邮箱子系统的挂接URL保持/email/不变,也算说的过去。不过如果下次报表系统被挂接到另 一个URL下面 —— 比如/mailbox/ , 又怎么办?
很显然,单纯地宅在你的报表子系统里面,没法找到一个万全的方案写出永远正确的邮箱 链接 —— 因为有个关键的信息在你的报表子系统外部:邮箱子系统的挂节点。
然而,在Django的根路由表里却恰好有这个信息。
修改示例代码,
1. 将根路由表urlpatterns中的第三项URL模式改为^xmail/
2. 运行代码,在首页点击链接"查看报表",进入报表子系统
3. 在报表子系统,点击链接"收件箱",为什么会出错?应该如何解决?