Django的URL

django--version : 1.9.8

urls.py负责把URL模式映射到应用程序,URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL模式以及要为该URL模式调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^time_show/', views.time_show),
]

URLconf 将在请求的URL 上查找,将它当做一个普通的Python 字符串来处理。但不包括GET和POST参数以及域名,URLconf 不检查请求的方法。换句话讲,所有的请求方法,同一个URL的HEAD、POST、GET等等都将路由到相同的函数。另外urlpatterns中的每个正则表达式在第一次访问它们时被编译。这使得系统相当快


 

1. Django 依次匹配每个URL 模式,在与请求的URL 匹配的第一个模式停下来

2. 一旦其中的一个正则表达式匹配上,Django 将导入并调用给出的视图,它是一个简单的Python 函数

3.若要从URL 中捕获一个值,只需要在它周围放置一对圆括号(未命名组)

eg:

对应urls.py

 urlpatterns = [
     url(r'^admin/', admin.site.urls),
     url(r'^time_show/', views.time_show),
     url(r'^(\d{4})', views.year),
 ]

对应views.py

 def time_show(request):
     return HttpResponse(time.asctime())
 
 
  def year(request, year):
     return HttpResponse(year)

 匹配到\d{4}时,其值将被捕获,这个参数传递的是字符串,即使匹配的是整数

4. 如果没有匹配到正则表达式,或者如果过程中抛出一个异常,Django 将调用一个适当的错误处理视图。

5. 不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles 而不是 ^/articles

6. 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义

上面的例子是通过未命名组的正则匹配来获取URL 中的值并以位置参数传递给视图函数的


 

命名组

语法:(/P<name>pattern),其中name是组的名称,pattern是要匹配的模式

eg:

对应urls.py

1 urlpatterns = [
2     url(r'^admin/', admin.site.urls),
3     url(r'^time_show/', views.time_show),
4     url(r'^(\d{4})$', views.year),
5     url(r'^(?P<year>\d{4})/(?P<month>\d{2})$', views.y_m),
6 ]

对应views.py

1 def y_m(request, year, month):
2     return HttpResponse('年份是{},月份是{}'.format(year, month))

这个实现与前面的示例完全相同,只有一个细微的差别:捕获的值作为关键字参数而不是位置参数传递给视图函数,这样做的好处是你的URLconf 会更加明晰且不容易产生参数顺序问题的错误  你可以在你的视图函数定义中重新安排参数的顺序 

回到顶部

posted @ 2018-05-03 23:23  sumcet  阅读(157)  评论(0编辑  收藏  举报