DJango系列的上一篇我们讲到了它是怎么解析和匹配URL的,并从URL中提取一些有用的信息(曾以year和month为例);但是,URL的管理仍然是一个巨大的工程,我们不得不维护数量庞大的pattern,即使有正则表达式的支持。另一方面,URL数量的增大也将带来匹配和解析正确性的考验。这一篇我们会进一步深入URL的学习,并掌握Reverse和Resolve。
一:Reverse和Resolve的作用
我们可以为某一个url映射定义一个名字,称之为url_name,这样有什么用呢?在此之前我们先介绍Reverse和Resolve的含义,函数模板如下:
# 其中viewname表示url_name# 其余的只要理解args即可,表示一些必要的参数,详见例子# 作用:从url_name得到URLreverse(viewname[, urlconf =
None ,
args = None
, kwargs =
None ,
current_app = None
])# path表示url# 作用: 从url得到相互映射的url_nameresolve(path, urlconf =
None ) |
那什么情况下我们需要用到它们呢?第一,如果在你的Project中需要给出一个网址(如网页重定向等),我们可以通过传递给Reverse函数相应的url_name以及必要的参数,那么便会生成相应的url;第二,在你调试阶段,可以通过Resolve函数来测试你的网站的URL对应关系是否如你所愿。
二:一个简单的例子
修改mysite/urls.py成如下代码:
from django.conf.urls
import patterns,
include, urhome =
'hello.views.home'urlpatterns =
patterns('', url(r
'^test$' ,
home, name = "test_hello"
), url(r
'(\d{4})/(\d{2})$' ,
home, name = "test_hello_2"
),) |
在网站根目录下运行:python manage.py shell进入DJango提供的shell环境.然后依次输入如下命令,你可以好好理解一下它们的输出结果:
#这一段曾经有错误,感谢xd(见评论区)同学的指正,万分感谢from django.core.urlresolvers
import reslove,
reverseurl =
resolve( '/2012/10'
)print url.url_name #输出应为test_hello_2reverse( 'test_hello_2'
,args =
( '2012'
, '10'
))#输出应为/2012/10 |
三:URL Include的目的
当一个Project的模块增多,只在根目录下维护一个urls.py来管理全局的URL对应关系显然是不合适的。如果每个模块都能管理和自己相关的URL,而根目录下的urls.py只负责把它们全部包含进来,不就解决问题了么?这有点像是C/C++里头文件的概念。URL Include的模板如下:
# regex 是正则式# URL_FILE_NAME 是子模块的urls.pyurl(regex, include( 'URL_FILE_NAME'
)) |
四:Include的例子
在hello文件下新建urls.py如下:
from django.conf.urls
import patterns,
include, urlhome =
'home'urlpatterns =
patterns('', url(r
'^$' ,
home),) |
然后修改mysite/urls.py,增加如下一行即可:
url(r '^'
, include( 'hello.urls'
)), |
现在通过python manage.py runserver启动服务器,在网址输入localhost:8000是不是显示正常呢?如果正常则说明我们include成功了。
不知道你注意到了没有,在mysite/urls.py的正则表达式里面是没有$的。原来在include的用法里,要匹配子模块的urls时是要先通过父模块的匹配,举个例子,如果mysite/urls.py中的匹配为:’^t’,那么传递进include中时是从t之后的开始的!
本文介绍 Django 中 Reverse 和 Resolve 的使用方法,通过命名 URL 提升项目可维护性,并展示如何通过 URL 反查功能获取 URL 名称及通过名称获取 URL。此外还讲解了 URL Include 的概念及其在大型项目中的应用。
2601

被折叠的 条评论
为什么被折叠?



