Django中提供了一個關於URL的映射的解決方案,django
1.客戶端的瀏覽器發起一個url請求,Django根據URL解析,把url中的參數捕獲,調用相應的試圖,獲取相應的數據,而後返回給客戶端顯示瀏覽器
2.經過一個視圖的名字,再加上一些參數和值,逆向獲取相應的URLapp
第一個就是日常的請求有URLconf來解析的過程,ide
第二個叫作,url的逆向解析,url逆向匹配,url的逆向查閱,等工具
Django提供了不一樣的層級的url逆向處理工具:url
1.在模板templates中,使用url標記,如:{% url %}spa
2.在Python代碼中,使用django.core.urlresolvers.reverse()方法3d
3.在更高一層級的處理url中,用get_absolute_url()方法code
新一個項目diangoorm
訪問longin頁面跳轉到 index頁面
app01 views.py
from django.shortcuts import render,redirect,HttpResponse def index(request): return HttpResponse('Index') def login(request): return HttpResponse('longin')
urls.py
from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^index/', views.index), url(r'^login/', views.login), ]
在日常作法
views.py
def login(request): return redirect('/index/')
若是usr 很長 urlpatterns = [ url(r'^index/xxxxx/xxx/xxx/xxx/xx/', views.index), url(r'^login/', views.login), ]
能夠用日常作法:
app01 views.py
def login(request): return redirect('/index/xxxxx/xxx/xxx/xxx/xx/')
這種方法看上去不是那麼的友好, 咱們用usl 別名的方式
導入reverse
app01/views.py
from django.urls import reverse def login(request): url = ('inx') return redirect(url)
urls.py
urlpatterns = [ url(r'^index/xxxxx/xxx/xxx/xxx/xx/', views.index,name='inx'), ]
經過 usl名稱,反向生成usl
include方法來實現路由轉發功能
urls.py
url(r'^cmdb/', include’(crm.urls)’),
crm/urls.py
from django.conf.urls import url,include from django.contrib import admin from crm import views urlpatterns = [ url(r'^hosts/', views.hosts,name='hosts'), ]
crm/views.py
def hosts(request): return HttpResponse('主機列表')
經過這個cmdb前綴分發,分發到本身的urls中,好處能夠將各類的業務拆分
反向生成時,使用reverse(‘namespace:name’)
新建app, monitor 、openstack ,
url(r'^monitor/', include('monitor.urls',namespace='m')), url(r'^openstack/', include('openstack.urls',namespace='o')),
monitor/ulrs.py
from django.conf.urls import url,include from django.contrib import admin from monitor import views urlpatterns = [ url(r'^hosts/', views.hosts,name='hosts'), ]
monitor/views.py
from django.shortcuts import render,HttpResponse def hosts(request): return HttpResponse('監控系統,主機列表')
openstack /ulrs.py
from django.conf.urls import url,include from django.contrib import admin from openstack import views urlpatterns = [ url(r'^hosts/', views.hosts,name='hosts'), ]
openstack /views.py
from django.shortcuts import render,HttpResponse def hosts(request): return HttpResponse('OpenStack,主機列表') 登陸成功時跳轉到 openstack/主機列表頁面
def login(request): return HttpResponse('Login') # 跳轉到 openstack主機列表頁面 # return redirect('/openstack/hosts/') url = reverse('o:hosts')
include本質 【就是元組,一級一級作分發】
urls.py
from monitor import views as mviews from openstack import views as oviews # /monitor/hosts/ url(r'^login/', views.login), url(r'^monitor/', ([ url(r'^hosts/',mviews.hosts,name='hhhhh'), url(r'^c1/',mviews.hosts), url(r'^x1/', ([ url(r'^xxx1/',mviews.hosts), url(r'^xxx2/',mviews.hosts,name='xx2'), url(r'^xxx3/',mviews.hosts), url(r'^xxx4/',mviews.hosts), ],None,None)), url(r'^c2/',mviews.hosts), url(r'^c3/',mviews.hosts), ],None,'mm')), url(r'^openstack/', ([ url(r'^hosts/',oviews.hosts,name='hhhhh'), url(r'^c1/',oviews.hosts), url(r'^c2/',oviews.hosts), url(r'^c3/',oviews.hosts), ],None,'oo')), ]
views.py
# 跳轉到 openstack主機列表頁面 url = reverse('oo:hhhhh') url = reverse('mm:uu:xx2')
動態生成url
views.py
def login(request): return HttpResponse('Login')
urls.py
urlpatterns = [ url(r'^login/', views.login), ]
for i in range(10): temp = [] for j in range(5): temp.append(url(r'^inner_%s/' % j, views.login)) v = url(r'^login_%s/' %i, (temp,None,None)) urlpatterns.append(v)