每个django项目都有一个urls.py文件用于维护URL dispatcher,该文件通过维护urlpatterns列表的元素完成url映射,每个元素都是一个django.conf.urls.url的实例
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^year/2015/$',views.moment_2015),
]
上面代码是中的路径一个严格路径,只匹配“year/2015”,改路径调用的是views.py中的moment_2015函数
正则表达式在url中应用很多,上面的代码中的’^‘还有’$‘就是正则表达式,分别意为’以…开始’,'以…结束‘。还有更多符号,例如[],+,()等都是正则表达式的符号,网上有很多这种符号的速查表,读者可以在需要时在网上查,这里不再过多赘述
在普通url映射中,django将url中的变量参数按照路径中的出现顺序传递给被调用函数,而命名url参数映射使得开发者可以定义这些被传递参数的参数名称,命名url参数的定义方式是"?P
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^year/2015/$',views.moment_2015),
url(r'^month/?P9[0-9]{4})/?P([0-9]{2})/$',views.month_moments),
]
上述代码的调用方式为:month_moments(request,year=xxxx,month=xx)
在大型django项目中,一个项目可能包含多个django应用,而每个应用有自己的独特的url映射规则,因此,将这些url映射保存在一个urls.py中就不利于对网站的维护,因此django提供了include()函数提供分布式url映射功能,是的url映射可以写在多个urls.py文件中
from django.conf.urls import url,include
from . import views
urlpatterns = [
url(r'^moment/',include('djangosite.app.urls')),
]
上述代码就应用了include()函数,提供了一个可以转接到
app应用中urls.py文件中的url映射的功能
app应用中的urls.py如下:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^year/2015/$',views.moment_2015),
]
此时讲一个请求传递到moment_2015函数的路径就是:http://xx.xx.xx.xx/moment/year/2015
除了上述从HTTP URL映射到Python视图函数的丰富的映射功能,django还提供了从映射名到URL地址的解析功能,URL反向解析使得开发者可以用映射名代替很多需要写绝对URL路径的地方,提高了代码的可维护性。
首先定义如下url映射规则:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^year/2015/$',views.year_moments,name="moment_2015"),
]
其中定义了一个URL映射,并通过name参数将该映射命名为moment_2015,在需要获得该URL的模版文件中可以通过{%url%}标签进行声明,例如:
查看2015年消息
其中用映射名"moment_2015"作为反向解析的参数,该模版解析后的结果为:
查看2015年消息
反向解析还支持在URL路径和被调用函数中有参数的情况,比如对于带参数的映射:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^year/?P([0-9]{4})/$',views.year_moments,name="moments"),
]
在模版文件的反向解析中,可以直接在{%url%}标签中添加参数,比如:
查看2014年消息
其中用映射名"moments"和URL参数2014作为反向解析的参数,该模版解析后的结果为:
查看2014年消息