1. 包含其他 URLconf
应用程序基于多个django站点,应该考虑到URLConfig包含【include】的方式来处理urls。
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^weblog/', include('mysite.blog.urls')),
(r'^photos/', include('mysite.photos.urls')),
(r'^about/$', 'mysite.views.about'),
)
重要的地方:指向 include() 的正则表达式并不包含一个 $ (字符串结尾匹配符),但是包含了一个斜杆。每当 Django 遇到 include() 时,它将截断匹配的URL,并把【剩余】的字符串发往被包含的 URLconf 作进一步处理。
被包含的 URLconf mysite.blog.urls :
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^(\d\d\d\d)/$', 'mysite.blog.views.year_detail'),
(r'^(\d\d\d\d)/(\d\d)/$', 'mysite.blog.views.month_detail'),
)
当请求:/weblog/2011/ 时,首先是 (r'^weblog/', include('mysite.blog.urls'))匹配/weblog/ , 由于使用include,正则停止匹配,并将 2011/发送到mysite.blog.urls中;
(r'^(\d\d\d\d)/$', 'mysite.blog.views.year_detail') 可以匹配 2011/ ,于是将执行 mysite.blog.views.year_detail 视图,并传递参数 2011
2. 捕获的参数如何和include()协同工作
一个被包含的URLconf 接收任何来自parent URLconfs 的被捕获的参数,比如:# root urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^(?P<username>\w+)/blog/', include('foo.urls.blog')),
)
# foo/urls/blog.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^$', 'foo.views.blog_index'),
(r'^archive/$', 'foo.views.blog_archive'),
)
在这个例子中,被捕获的 username 变量将传递给被包含的 URLconf,进而传递给那个
URLconf 中的 每一个 视图函数。
注意,这个被捕获的参数 总是 传递到被包含的URLconf 中的 每一 行,不管那些行对应的
视图是否需要这些参数。因此,这个技术只有在你确实需要那个被传递的参数的时候才显得
有用。
3. 额外的URLconf如何和include()协同工作
相似的,你可以传递额外的 URLconf 选项到 include() , 就像你可以通过字典传递额外的URLconf 选项到普通的视图。当你这样做的时候,被包含 URLconf 的 每一 行都会收那些额外的参数。 比如,下面的两个 URLconf 在功能上是相等的。# urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^blog/', include('inner'), {'blogid': 3}),
)
# inner.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^archive/$', 'mysite.views.archive'),
(r'^about/$', 'mysite.views.about'),
(r'^rss/$', 'mysite.views.rss'),
)
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^blog/', include('inner')),
)
# inner.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^archive/$', 'mysite.views.archive', {'blogid': 3}),
(r'^about/$', 'mysite.views.about', {'blogid': 3}),
(r'^rss/$', 'mysite.views.rss', {'blogid': 3}),
)
这个例子和前面关于被捕获的参数一样(在上一节就解释过这一点),额外的选项将 总是传递到被包含的 URLconf 中的 每一 行,不管那一行对应的视图是否确实作为有效参数接这些选项,因此,这个技术只有在你确实需要那个被传递的额外参数的时候才显得有用。