Django - 路由系统

主要内容

  • 1. URLconf配置
  • 2.命名URL和URL反向解析
  • 3.namespace 
  • 4.路由系统的本质(路由的分发)

1. URLconf配置

1.1 基本格式

from django.conf.urls import url
urlpatterns = [
         url(正则表达式,view视图,参数,别名)
]

参数说明:

  • 正则表达式:一个正则表达式字符串
  • view视图:一个可调用对象,通常为一个视图函数
  • 参数:可选的要传递给视图函数的默认参数(字典形式)
  • 别名:一个可选的name参数

注意:

Django 2.0版本中的路由系统是下面的写法

官方文档:https://docs.djangoproject.com/en/1.11/topics/http/urls/

from django.conf.urls import path,re_path
urlpatterns = [
         path(正则表达式,view视图,参数,别名)
]

1.2 正则表达式

(1)分组匹配

#匹配到参数,按照位置参数的方式传递给视图函数  视图函数需要定义形参接收变量
url(r'^del_publisher/(\d+)', views.del_publisher),

注:

若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。

从URL上捕获的参数都是字符串类型

(2)命名分组

#示例
url(r'^blog/(?P<year>\d{4})/[1-9]{2}/$', views.blog)

1.3 include 其他的urls.py

from django.conf.urls import url,include
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'app01/',include('app01.urls')),
    url(r'app02/',include('app02.urls'))
]

2.URL的命名和URL反向解析

2.1 普通url

(1)命名

#以命名publisher_list为例
url(r'^publisher_list/', views.publisher_list, name='publisher'),

(2)使用

  • 在视图中使用
    from django.urls import reverse
    reverse('publisher')
  • 在模板中使用
    {% url 'publisher'%} 

 2.2 使用分组

(1)命名

url(r'^blog/(\d{4})/([1-9]{2})/$', views.blog, name='blog')

(2)使用

  • 在视图中使用
    reverse('blog',args=('2018','12'))  
  • 在模板中使用
    {% url  ’blog‘  ’2018‘  ’12‘  %}    

2.3 使用命名分组

(1)定义

url(r'^blog/(?P<year>\d{4})/(?P<month>[1-9]{2})/$', views.blog, name='blog')

(2)使用

  • 视图中使用
    reverse('blog',args=('2018','12'))         ‘/blog/2018/12/'
    
    reverse('blog', kwargs={'month': '12', 'year': '2018'})
  • 模板中使用
    {% url 'blog'  '2018' '12' %}     ——》 ‘/blog/2018/12/'
    
    {% url 'blog'  year='2018' month='12' %}    ——》  ‘/blog/2018/12/'
    
    {% url 'blog'  month='12' year='2018'  %}    ——》  ‘/blog/2018/12/'

 3.namespace

(1)定义

 

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

 

url(r'^home/$', views.home, name='home'),   # app01

(2)使用

  • 视图
    reverse(’app01:home‘)    ——》 /app01/home/
    
    reverse(’app02:home‘)    ——》 /app02/home/
  • 模板
    {% url 'app01:home' %}   —》 /app01/home/

     

 

---恢复内容结束---

主要内容

  • 1. URLconf配置
  • 2.命名URL和URL反向解析
  • 3.namespace 

1. URLconf配置

1.1 基本格式

from django.conf.urls import url
urlpatterns = [
         url(正则表达式,view视图,参数,别名)
]

参数说明:

  • 正则表达式:一个正则表达式字符串
  • view视图:一个可调用对象,通常为一个视图函数
  • 参数:可选的要传递给视图函数的默认参数(字典形式)
  • 别名:一个可选的name参数

注意:

Django 2.0版本中的路由系统是下面的写法

官方文档:https://docs.djangoproject.com/en/1.11/topics/http/urls/

from django.conf.urls import path,re_path
urlpatterns = [
         path(正则表达式,view视图,参数,别名)
]

1.2 正则表达式

(1)分组匹配

#匹配到参数,按照位置参数的方式传递给视图函数  视图函数需要定义形参接收变量
url(r'^del_publisher/(\d+)', views.del_publisher),

注:

若要从URL中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。

从URL上捕获的参数都是字符串类型

(2)命名分组

#示例
url(r'^blog/(?P<year>\d{4})/[1-9]{2}/$', views.blog)

1.3 include 其他的urls.py

from django.conf.urls import url,include
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'app01/',include('app01.urls')),
    url(r'app02/',include('app02.urls'))
]

2.URL的命名和URL反向解析

2.1 普通url

(1)命名

#以命名publisher_list为例
url(r'^publisher_list/', views.publisher_list, name='publisher'),

(2)使用

  • 在视图中使用
    from django.urls import reverse
    reverse('publisher')
  • 在模板中使用
    {% url 'publisher'%} 

 2.2 使用分组

(1)命名

url(r'^blog/(\d{4})/([1-9]{2})/$', views.blog, name='blog')

(2)使用

  • 在视图中使用
    reverse('blog',args=('2018','12'))  
  • 在模板中使用
    {% url  ’blog‘  ’2018‘  ’12‘  %}    

2.3 使用命名分组

(1)定义

url(r'^blog/(?P<year>\d{4})/(?P<month>[1-9]{2})/$', views.blog, name='blog')

(2)使用

  • 视图中使用
    reverse('blog',args=('2018','12'))         ‘/blog/2018/12/'
    
    reverse('blog', kwargs={'month': '12', 'year': '2018'})
  • 模板中使用
    {% url 'blog'  '2018' '12' %}     ——》 ‘/blog/2018/12/'
    
    {% url 'blog'  year='2018' month='12' %}    ——》  ‘/blog/2018/12/'
    
    {% url 'blog'  month='12' year='2018'  %}    ——》  ‘/blog/2018/12/'

 3.namespace

(1)定义

 

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

 

url(r'^home/$', views.home, name='home'),   # app01

(2)使用

  • 视图
    reverse(’app01:home‘)    ——》 /app01/home/
    
    reverse(’app02:home‘)    ——》 /app02/home/
  • 模板
    {% url 'app01:home' %}   —》 /app01/home/ 

 4.路由系统的本质(路由的分发)

4.1 使用include实现路由的分发

  • 根urls.py中
    from django.conf.urls import url,include
    from django.contrib import admin
    
    
    #  return (urlconf_module, app_name, namespace)
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^rbac/', include('app01.urls,nameapace='rbac)
    ]
  • app01.urls.py
    from django.conf.urls import url,include
    from app01 import views
    
    urlpatterns = [
        url(r'^login/', views.login,name='l1'), #'rbac:l1'
        url(r'^logout/', include('app01.urls2'))
    ]
  • 又一级的分发 app01.urls2.py
    from django.conf.urls import url,include
    from app01 import views
    
    urlpatterns = [
        url(r'^x1/', views.login,name='l2'), # rbac:l2
        url(r'^x2/',views.login,name='l3'),  #rbac:l3
    ]

4.2不使用include实现路由分发

(1)include的本质

#在include的源码中 返回的是一个元祖
def include(arg, namespace=None, app_name=None):
    #其中元祖的第一项是放置路由关系的列表
    return (urlconf_module, app_name, namespace)

(2) 不使用include实现路由分发

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # 源码内部实际上是一个列表,存放路由关系
    url(r'^rbac/', ([
                        url(r'^login/', views.login),
                        url(r'^logout/', views.logout),
                        url(r'^x1/', ([
                                          url(r'^add/', views.add,name='n1'),
                                          url(r'^change/', views.change,name='n2')
                                      ], None, 'xxx'))
                    ], None, 'rbac')),

]

 

posted @ 2018-12-05 15:12  一路向北_听风  阅读(147)  评论(0)    收藏  举报