zoukankan      html  css  js  c++  java
  • 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都没事,就写活了,就不像一开始写的硬编码了。

  • 相关阅读:
    malloc
    排序算法学习笔记(三)-- 快速排序
    排序算法学习笔记(二)-- 归并排序
    排序算法学习笔记(一)-- 冒泡排序,选择排序,插入排序,希尔排序
    网络协议笔记
    域名和IP地址并用的理由
    WebSocket协议介绍
    Ajax概念
    共享密钥加密、公开密钥加密及HTTPS混合加密
    HTTP缺点
  • 原文地址:https://www.cnblogs.com/xihuxiangri/p/9878138.html
Copyright © 2011-2022 走看看