⼀个项⽬可以有很多 urls.py 分布在多个应⽤(app)中。Django 需要⼀个 url.py 作为⼊⼝。
这个特殊的 urls.py 叫做根路由配置(root URLconf)。它被定义在 settings.py 中:
ROOT_URLCONF = 'XXX.urls'
当 Django 接受⼀个请求(request), 它就会在项⽬的 URLconf 中寻找匹配项。他从 urlpatterns 变量的第⼀条开始,然后在每个 url 中去匹配请求的 URL。
如果 Django 找到了⼀个匹配路径,他会把请求(request)发送给 url 的第⼆个参数视图函数(view function)。所以说 urlpatterns 中的顺序非常重要,因为一旦匹配到就会停止搜索,如果Django在URLconf 中没有找到匹配项,他会通过 Page Not Found 的错误处理代码抛出一个404异常。
def url(regex, view, kwargs=None, name=None):
# ...
- regex: 匹配URL patterns的正则表达式。( 注意:正则表达式会忽略掉 GET 或者 POST 后⾯的参数。在⼀个 http://127.0.0.1:8000/boards/?page=2 的请求中,只有 /boards/ 会被处理。)
- view: 视图函数被⽤来处理⽤户请求,同时它还可以是 django.conf.urls.include 函数的返回值,它将引⽤⼀个外部的urls.py ⽂件,例如,你可以使⽤它来定义⼀组特定于应⽤的 URLs,使⽤前缀将其包含在根 URLconf 中。
- kwargs: 传递给⽬标视图函数的任意关键字参数,它通常⽤于在可重⽤ 视图上进⾏⼀些简单的定制,我们不是经常使⽤它。
- name: 该 URL 的唯⼀标识符。这是⼀个⾮常重要的特征。要始终记 得为你的 URLs 命名。所以,很重要的⼀点是:不要在 views(视图) 或者 templates(模板) 中硬编码 URL,⽽是通过它的名字去引⽤URL。
高级URLs路由
更⾼级的URL路由使⽤⽅法是通过正则表达式来匹配某些类型的数据并创建动态 URL
比如这个例子中的url:
url(r'^boards/(?P<pk>\d+)/new/$', views.new_topic, name='new_topic'),
正则表达式中的 \d+ 会匹配⼀个任意⼤⼩的整数值,这个正则表达式 (? P<pk>\d+) 这是告诉 Django 将捕获到的值放入名
为 pk 的关键字参数中。这时候他的视图函数应该是这样的:
def new_topic(request, pk):
# do something...
如果想在视图函数中使用使用任意名字的参数,那么可以这么定义:
url(r'^boards/(\d+)/new/$', views.new_topic, name='new_topic'),