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都没事,就写活了,就不像一开始写的硬编码了。

 

posted @ 2019-03-11 15:40  xihuxiangri  阅读(107)  评论(0编辑  收藏  举报