主要内容
- 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中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
(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中捕获一个值,只需要在它周围放置一对圆括号(分组匹配)。
(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')), ]