django路由层
URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表 : 就是以这种方法告诉Django,对于客户端发来的某个URL调用那一段代码.
简单的路由配置
在Django中的版本1.0中,URLS里面是 url(r'^xxx/xx$',xxx)就是属于正则匹配以xxx开头,以xx结尾,然后去后面的路径去匹配.但是在Django2.0版本中则是path.但是在内部已经封装了(^,$)了,但是要注意的是,path只适合在后面或者里面不在加任何的正则表达式,如果想要在里面在加上正则表达式,那么就要引入 re_path . re_path = url.
所以 : 使用正则 re_path(它没有封装(^,$)) , 不用正则 path(封装了(^,$))
from django.urls import path,re_path from app01 import views urlpatterns = [ re_path(r'^articles/2003/$', views.special_case_2003), re_path('^articles/([0-9]{4})/$', views.year_archive), re_path('^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), re_path('^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail), ]
注意 :
- 若要从URL上捕获一个值,只需要在它周围放置一对圆括号.
- 不要添加一个前导的反斜杠.
- 每个正则表达式前面的 r 是可选的,建议加上.它会告诉python这个字符串是""原始的"",字符串中任何字符都不应该转移.
''' 一些请求的例子: /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数views.month_archive(request, '2005', '03')。 /articles/2005/3/ 不匹配任何URL 模式,因为列表中的第三个模式要求月份应该是两个数字。 /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,第一个会首先测试是否匹配。请像这样自由插入一些特殊的情况来探测匹配的次序。 /articles/2003 不匹配任何一个模式,因为每个模式要求URL 以一个反斜线结尾。 /articles/2003/03/03/ 将匹配最后一个模式。Django 将调用函数views.article_detail(request, '2003', '03', '03')。 '''
有名分组
上面的示例使用简单的、没有命名的正则表达式组(通过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可以使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是(?P<name>pattern)
,其中name
是组的名称,pattern
是要匹配的模式。
下面是以上URLconf 使用命名组的重写:
from django.urls import path,re_path from app01 import views urlpatterns = [ re_path(r'^articles/2003/$', views.special_case_2003), re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail), ]
注意 : 使用有名分组的时候,year 和 month 的参数顺序可以改变,但是名字必须要与前面urls的一样.捕获的值作为关键字参数而不是位置参数传递给视图函数.
''' /articles/2005/03/ 请求将调用views.month_archive(request, year='2005', month='03')函数,而不是views.month_archive(request, '2005', '03')。 /articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。 '''
分发 include
如果当有很多APP,有很多urls的时候,如果都写到全局的urls中,那么会很乱,但是我们可以将app01的url放到app01下等的uels中,在全局中放路径
# 在全局urls中 re_path('^app01/',include('app01.urls')), re_path('^app02/',include('app02.urls')), #在app01的urls中 from django.conf.urls import url,include from app01 import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), # special_case_2003(request) url(r'^articles/(\d{4})/$', views.year_archive), # year_archive(request,2006) #url(r'^articles/(\d{4})/(\d{2})/$', views.year_month_archive), # year_month_archive(request,2006,12) ] #在app02中同理
反向解析
我们一开始写的硬编码,也就是吧action要跳转的路径写死了。但是像淘宝,天猫等都会经常更新新东西,,那么你的页面上的url路径也会时不时的变化。但是如果有特别多的商品,那么你就得去服务端一个一个的改,这样显得很麻烦,那么有没有一种机制帮我们解决问题呢?
解决方法 :
1、首先给url起一个别名。
2、然后在login.html中写上{% url ‘别名’’ %} ,如果在页面中点击查看元素,它会变成 login.html,,,
3、这样你就可以修改你的正则了,,因为他是按照别名走的,不会影响。
urls.py
login.html
我们在页面中检查 :
这样的好处是:无论你怎么改你要匹配的url,只要你写上了别名。在html实现了模板语法,就会去找别名对应的那个url,以后不管你怎么改url都没事,就写活了,就不像一开始写的硬编码了。