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 会更加明晰且不容易产生参数顺序问题的错误 你可以在你的视图函数定义中重新安排参数的顺序