django之路由

Posted quzq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django之路由相关的知识,希望对你有一定的参考价值。

 

路由是指当请求来后,一种请求对应一种函数的那个urls.py配置文件中的映射关系

1. urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。

2.当浏览器访问请求的url不是以/结尾时,jango会自动给该请求加/结尾,并让浏览器重新访问.可设置

  为不主动加结尾处的/,方法:settings.py文件中加入APPEND_SLASH=False即可,配置文件中虽然没

 有这个参数,但默认结果是True;当配置完成后url请求后不加/时是访问不到页面的.(了解即可)

3. URLconf匹配的位置: URLconf 在请求的URL 上查找,将它当做一个普通的Python 字符串,会取

     网址之后?号之前的字符串来做正则匹配. 且匹配出来的所有东西都是字符串形式.

.  分组命名匹配:

    1. url(r‘^articles/([0-9]{4})/$‘, views.func) 普通分组形式

      以上路由中,通过对正则加分组,可以把分组内捕获的内容以参数形式传给func函数,通过这

  个原理我们可以不用再使用?id=’xx’的形式来传数据了,可用正则分组来实现,只需在href处拼

  接好结构即可. 是以位置参数的形式直接传给视图函数的.

    2.  url(r‘^articles/(?P<name>[0-9]{4})/$‘, views.func)  分组命名形式

         在更高级的用法中,可以使用分组命名匹配的正则表达式组来捕获URL中的值并以关键

   字参数形式传递给视图。在Python的正则表达式中,分组命名正则表达式组的语法是

         (?P<name>pattern),其中name是组的名称, pattern代表匹配的正则表达式; 这个是以

   关键字参数的形式直接传值给视图函数的,所以要求视图函数的形参名字不能随便起.

补充: 上面12是两种给视图函数传参的方式,还有第3中方式,了解即可:

       url(r‘^articles/(?P<name>[0-9]{4})/$‘, views.func, {‘name’:’20’})

       如上:在后面再加入个字典,当字典的key和分组命名的名字重复时,系统优先使用字典key

       对应的value, 当两个不冲突时,都会使用. 视图函数形参处为*args**kwargs

 

    3. 视图函数中指定默认值,代码如下:

        urlpatterns = [

              url(r‘^blog/$‘, views.page),

              url(r‘^blog/page(?P<num>[0-9]+)/$‘, views.page),

             ]

        # views.py中,可以为num指定默认值

        def page(request, num="1"):

                pass

      url访问请求不含数字时,默认返回第一页内容,当请求包含数字时,会动态的替换调num

      的值,从而达到返回指定页面的目的.

 

. 路由的分发:

   1. 思路: 把本该在项目目录下的urls.py中进行路由匹配的功能给分发到每个包内,在包内新建

                urls.py文件来进行路由匹配;在项目目录下的urls.py中建立分发指引路径即可.

   2. 现有app名为app01,做法如下:

      首先在项目目录的urls.py中导入  from django.conf.urls import  include

      然后配置  urlpatterns = [

                     url(r‘^app01/‘, include(‘app01.urls‘)),  ]    # 路由分发至app01中    

      注意分发完成后再访问时url前面就多了app01,所有页面内引用到url地方都要改

 

. 命名URLURL反向解析

     1.urls.py路由中指定别名

     2.views.py视图文件中导入from django.shortcuts import render, redirect, reverse

     3.也可从这里导入:from django.urls import  reverse

 命名URL:

  普通命名 url(r‘^class/$‘, views.class, name=’cla’ )

      分组命名 url(r‘^class/([0-9]{4})/([0-9]{2})/$‘, views.class, name=’cla’ )

      命名分组 url(r‘^class/(?P<x>[0-9]{4})/(?P<y>[0-9]{2})/$‘, views.class, name=’cla’ )

  URL反向解析:

     在视图函数中的语法:  views.py中导入from django.urls import  reverse

      普通: redirect( reverse(‘cla’) )  # 会动态的感知cla对应的url中正则的变化,并体现出来

      分组: redirect( reverse(‘cla’ , args=(‘6666’, ’88’) ) )  # 有参正则给的参数要符合正则规则

      命名: redirect( reverse(‘cla’ , kwargs={ ‘x’:‘6666’, ’y’: ’88’} ) )  # 同上

    html模板中的语法:

      普通: {% url ‘cla’ %}  # url 后跟别名即可,会动态感知并替换

      分组: {% url ‘cla’ ‘6666’ ‘88’ %}  # 原理同上视图中

      命名: {% url ‘cla’ x=‘6666’ y=‘88’ %}

 

. 项目中存在多个包,且包内别名有重复时:

      以下是项目目录下的主路由语法, 其中namespace是固定写法,不可变

       url(r‘app02/‘, include(‘app02.urls‘,namespace=‘app02‘)),

       url(r‘app01/‘,include(‘app01.urls‘,namespace=‘app01‘)),

  以下是views.py中函数视图内的语法:

       reverse(‘app01:home‘,kwargs={‘year‘:‘2018‘,‘month‘:‘10‘})

       reverse(‘app02:home‘,kwargs={‘year‘:‘2018‘,‘month‘:‘10‘})

 以下是html页面中的语法:

       {% url ‘app02:home‘ ‘2018‘ ‘10‘  %}

以上是关于django之路由的主要内容,如果未能解决你的问题,请参考以下文章

Django之路由

Django之路由层

Django之路由层

Django之路由层

Django之路由层

Django之路由系统