1、单一路由对应
url(r'^index/', views.index), # FBV
url(r'^home/', views.Home.as_view()), # CBV
2、基于正则的路由
1 url(r'^detail-(d+).html', views.detail), 2 3 url(^'^detail-(d+)-(d+).html',views.detail), 4 ''' 5 严格按照位置参数的顺序传入参数,如果在实际环境中,def detail(request,nid,uid)在定义时,参数的指定出现差错,则会导致下面的对参数的引用出现错误。 6 ''' 7 8 url(r'^detail-(?P<nid>d+)-(?P<uid>d+).html', views.detail), 9 ''' 10 传参时确保了nid=第一个传入的位置参数,uid=第二个传入的位置参数。 11 '''
实例1:实现 ?nid={{ id }}的url:

1 from django.conf.urls import url 2 from django.contrib import admin 3 from app01 import views 4 5 urlpatterns = [ 6 url(r'^admin/', admin.site.urls), 7 url(r'^login',views.login), 8 url(r'^index',views.index), 9 url(r'^detail',views.detail), 10 # url(r'^detail-(d+).html',views.detail), 11 url(r'^home',views.Home.as_view()), #对应类Home的对应方法 12 ]

1 USER_DICT={ 2 '1':{'name':'root1','email':'root@live.com'}, 3 '2':{'name':'root2','email':'root@live.com'}, 4 '3':{'name':'root3','email':'root@live.com'}, 5 '4':{'name':'root4','email':'root@live.com'}, 6 '5':{'name':'root5','email':'root@live.com'}, 7 } 8 9 def detail(request): 10 nid=request.GET.get('nid',None) 11 detail_info=USER_DICT[nid] 12 return render(request,'detail.html',{'detail_info':detail_info})

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>详细信息</h1> 9 <h6>用户名:{{ detail_info.name }}</h6> 10 <h6>邮箱:{{ detail_info.email }}</h6> 11 </body> 12 </html>

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 9 <ul> 10 {% for k,v in user_dict.items %} 11 <li><a target=_blank href="/detail?nid={{ k }}">{{ v.name }}</a></li> 12 {% endfor %} 13 </ul> 14 15 </body> 16 </html>
实例2:实现url-{{ id }} 以这种方式用正则表达式取页面。

1 from django.conf.urls import url 2 from django.contrib import admin 3 from app01 import views 4 5 urlpatterns = [ 6 url(r'^admin/', admin.site.urls), 7 url(r'^login',views.login), 8 url(r'^index',views.index), 9 # url(r'^detail',views.detail), 10 url(r'^detail-(d+).html',views.detail), 11 url(r'^home',views.Home.as_view()), #对应类Home的对应方法 12 ]

1 USER_DICT={ 2 '1':{'name':'root1','email':'root@live.com'}, 3 '2':{'name':'root2','email':'root@live.com'}, 4 '3':{'name':'root3','email':'root@live.com'}, 5 '4':{'name':'root4','email':'root@live.com'}, 6 '5':{'name':'root5','email':'root@live.com'}, 7 } 8 9 def detail(request,nid): 10 # nid=request.GET.get('nid',None) 11 detail_info=USER_DICT[nid] 12 return render(request,'detail.html',{'detail_info':detail_info})

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 <h1>详细信息</h1> 9 <h6>用户名:{{ detail_info.name }}</h6> 10 <h6>邮箱:{{ detail_info.email }}</h6> 11 </body> 12 </html>

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 </head> 7 <body> 8 9 <ul> 10 {% for k,v in user_dict.items %} 11 <li><a target=_blank href="/detail-{{ k }}.html">{{ v.name }}</a></li> 12 {% endfor %} 13 </ul> 14 15 </body> 16 </html>
3、为路由映射设置名称
对URL路由关系进行命名, ***** 以后可以根据此名称生成自己想要的URL *****
1 url(r'^asdfasdfasdf/', views.index, name='i1'), 2 对应在index.html中: 3 <form action="{% url "i1" %}" method="POST"> 4 5 url(r'^index/(d+)/(d+)/', views.index, name='i2'), 6 对应在index.html中: 7 <form action="{% url "i2" 1 2 %}" method="POST"> 8 9 url(r'^index/(?P<pid>d+)/(?P<nid>d+)/', views.index, name='i3'), 10 对应在index.html中: 11 <form action="{% url "i3" pid=1 nid=9 %}" method="POST"> 12 13 # 获取当前的URL 14 request.path_info 15 16 17 # 在函数中生成URL 18 def func(request, *args, **kwargs): 19 from django.urls import reverse 20 21 url1 = reverse('i1') # asdfasdfasdf/ 22 url2 = reverse('i2', args=(1,2,)) # index/1/2/ 23 url3 = reverse('i3', kwargs={'pid': 1, "nid": 9}) # index/1/9/
4、多级路由:根据app对路由规则进行分类
客户端请求先到project/urls.py中进行匹配,匹配到下面的各个app的app/urls.py中。

1 from django.conf.urls import url,include 2 from django.contrib import admin 3 4 urlpatterns = [ 5 url(r'^cmdb/', include("app01.urls")), 6 url(r'^monitor/', include("app02.urls")), 7 ]

1 from django.conf.urls import url,include 2 from django.contrib import admin 3 from app01 import views 4 5 urlpatterns = [ 6 url(r'^login/', views.login), 7 ]

1 from django.conf.urls import url,include 2 from django.contrib import admin 3 from app02 import views 4 5 urlpatterns = [ 6 url(r'^login/', views.login), 7 ]
5、默认值
url(r'^index/', views.index, {'name': 'root'}),

1 def index(request,name): 2 print(name) 3 return HttpResponse('OK')
在url中添加额外的参数后,在对应的视图函数中必须设置相应的形式参数name。在执行该方法时会自动传入默认值‘root'作为实参。
6、命名空间
a. project.urls.py
1
2
3
4
5
6
|
from django.conf.urls import url,include urlpatterns = [ url(r '^a/' , include( 'app01.urls' , namespace = 'author-polls' )), url(r '^b/' , include( 'app01.urls' , namespace = 'publisher-polls' )), ] |
b. app01.urls.py
1
2
3
4
5
6
7
|
from django.conf.urls import url from app01 import views app_name = 'app01' urlpatterns = [ url(r '^(?P<pk>d+)/$' , views.detail, name = 'detail' ) ] |
c. app01.views.py
1
2
3
|
def detail(request, pk): print (request.resolver_match) return HttpResponse(pk) |
以上定义带命名空间的url之后,使用name生成URL时候,应该如下:
- v = reverse('author-polls:detail', kwargs={'pk':11})
- {% url 'author-polls:detail' pk=11 %}
django中的路由系统和其他语言的框架有所不同,在django中每一个请求的url都要有一条路由映射,这样才能将请求交给对一个的view中的函数去处理。其他大部分的Web框架则是对一类的url请求做一条路由映射,从而是路由系统变得简洁。