8、第十 - WEB開發進階 - Django URL路由分發
Django的路由模式,主要是定義前端的URL訪問模式。簡單歸納有以下幾種方式:
- 1、FBV結構:path(r'index/',views.index); CBV結構:path(r'home',views.Home.as_view()),
- 2、字串拼接:path(r'detail-(\d+).html',views.detail)) 嚴格按照傳參的順序進行。
- 3、指定引數傳輸:url('^detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.detail) 推薦使用這種方法,在後續進行邏輯處理的時候,即使順序排錯,也不影響邏輯方法的處理計算。
- 4、urls.py配置中路由分發對name的使用:對URL關係進行命名,以後可以根據此名稱生成自己想要的URL。 如:
url(r'ffafafff/',views.index,name='i1');
url(r'yun/(\d+)/(\d+)/',views.index,name='i2');
url(r'buy/(?P<nid>\d+)/(?P<uid>\d+)/',views.index,name='i3'); - 5、建立專案,在構建多APP時,進行的URL分發:
第一種型別是參考前面的舉例。第二種開始進行介紹:
1、舉例:首先要知道,字典資料後是如何進行的跳轉到詳情頁(模板語言中封裝a標籤),過程如下:
urls.py 檔案設定:
from django.contrib import admin from django.urls import path from docker import views urlpatterns = [ path('admin/', admin.site.urls), path(r'index/',views.index), path(r'index/home.html', views.detail),#根據跳轉的URL進行的頁面 ]
views.py 邏輯處理定義:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View user_dict = { 1:{'k1':'v1'}, 2:{'k2':'v2'}, 3:{'k3':'v3'}, 4:{'k4':'v4'}, } def index(request): return render(request,'2.html',{'user_dict':user_dict}) def detail(request): return render(request,'home.html')
模板語言定義 2.html :
<body> <ul> {% for row in user_dict.values %} <li><a href="home.html">{{ row }}</a></li> 封裝跳轉的URL {% endfor %} </ul> </body>
定義被跳轉的頁面:
<body> <p> Welcome To Docker !!! </p> </body>
效果如下:(點選藍色字型,進行跳轉到home.html頁面)
2、舉例:通過問號“?”的URL進行字典資料獲取及匹配(動態資料處理)。如下:
簡單版:
urls.py 檔案:
from django.contrib import admin from django.urls import path from docker import views urlpatterns = [ path('admin/', admin.site.urls), path(r'index/',views.index), path(r'detail/',views.detail), ]
views.py邏輯處理:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View #定義字典 user_dict = { 'root1':{'name':'k1','email':'[email protected]','number':'123'}, 'root2':{'name':'k2','email':'[email protected]','number':'124'}, 'root3':{'name':'k3','email':'[email protected]','number':'125'}, 'root4':{'name':'k4','email':'[email protected]','number':'126'}, } #訪問主頁放回資料展示 def index(request): return render(request,'2.html',{'user_dict':user_dict}) #跳轉詳情頁的資料,根據獲取到nid的資料並返回nid展示 def detail(request): nid = request.GET.get('nid') return HttpResponse(nid)
模板語言定義:2.html
<body> <ul> {% for k,row in user_dict.items %} <li><a target="_blank" href="/detail/?nid={{k}}">{{ row.name }}</a></li> 獲取使用者名稱資料 {% endfor %} </ul> </body>
效果如下:(可根據nid=root4進行更改,可獲取不同的資料)
http://127.0.0.1:8000/detail/?nid=root4
知識擴充套件:
變更一下,處理的方法,調整跳轉的詳情頁:
urls.py、2.html 檔案不變,就邏輯處理的檔案 views.py 如下:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View user_dict = { 'root1':{'name':'k1','email':'[email protected]','number':'123'}, 'root2':{'name':'k2','email':'[email protected]','number':'124'}, 'root3':{'name':'k3','email':'[email protected]','number':'125'}, 'root4':{'name':'k4','email':'[email protected]','number':'126'}, } def index(request): return render(request,'2.html',{'user_dict':user_dict}) def detail(request): nid = request.GET.get('nid') detail_info = user_dict[nid] return render(request,'home.html',{'detail_info':detail_info})
定義詳情頁的home.html 檔案,如下:
<body> <h1>詳情頁面</h1> <h3>使用者名稱:{{detail_info.name}}</h3> <h3>郵箱:{{ detail_info.email }}</h3> </body>
效果如下:
3、舉例:動態資料處理,跟進正則表示式。生成靜態頁面返回,(市場上比較常用)。如下:
正則表示式 (或 regexes ) 是通用的文字模式匹配的方法。 Django URLconfs 允許你 使用任意的正則表示式來做強有力的URL對映,不過通常你實際上可能只需要使用很少的一 部分功能。
檔案配置,如下:
urls.py 路由分發配置:
Django 1版本與2版本,是有比較大的區。所以,在配置正則表示式的時候,可參考官網:https://docs.djangoproject.com/en/2.0/intro/tutorial03/
from django.contrib import admin from django.urls import path from docker import views from django.conf.urls import url #匯入url庫表 urlpatterns = [ path('admin/', admin.site.urls), path(r'index/',views.index), url(r'^detail-(?P<nid>\d+).html',views.detail), #採用url的路徑分發方式,進行匹配。nid採用正則分組,進行資料傳參。 ]
views.py 邏輯處理指令碼:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View user_dict = { '1':{'name':'k1','email':'[email protected]','number':'123'}, '2':{'name':'k2','email':'[email protected]','number':'124'}, '3':{'name':'k3','email':'[email protected]','number':'125'}, '4':{'name':'k4','email':'[email protected]','number':'126'}, } def index(request): return render(request,'2.html',{'user_dict':user_dict}) def detail(request,nid): detail_info = user_dict[nid] return render(request,'home.html',{'detail_info':detail_info})
模板語言定義2.html:
<body> <ul> {% for k,row in user_dict.items %} <li><a target="_blank" href="detail-{{ k }}.html">{{ row.name }}</a></li> {% endfor %} </ul> </body>
跳轉返回的詳情頁 home.html:
<body> <h1>詳情頁面</h1> <h3>使用者名稱:{{detail_info.name}}</h3> <h3>郵箱:{{ detail_info.email }}</h3> </body>
效果(通過更改nid的資訊,可以得出不同的賬號資訊。)如下:
http://127.0.0.1:8000/detail-1.html
知識擴充套件:
當路由分發處理多個,正則分組的資料時, 可根據前端瀏覽器的get請求,進行資料nid\uid處理。如下:
urls.py 路由分發設定,nid 及uid 的傳輸獲取:
from django.contrib import admin from django.urls import path from docker import views from django.conf.urls import url #匯入url庫 urlpatterns = [ path('admin/', admin.site.urls), path(r'index/',views.index), url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.detail), #設定好nid\uid 的正則分組 ]
views.py 邏輯處理:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View user_dict = { '1':{'name':'k1','email':'[email protected]','number':'123'}, '2':{'name':'k2','email':'[email protected]','number':'124'}, '3':{'name':'k3','email':'[email protected]','number':'125'}, '4':{'name':'k4','email':'[email protected]','number':'126'}, } def index(request): return render(request,'2.html',{'user_dict':user_dict}) def detail(request,nid,uid): print (nid,uid) #測試,獲取到的nid,uid detail_info = user_dict[nid] return render(request,'home.html',{'detail_info':detail_info}) #進行模板語言資料展示
home.html 模板語言定義:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>詳情頁面</h1> <h3>使用者名稱:{{detail_info.name}}</h3> <h3>郵箱:{{ detail_info.email }}</h3> </body> </html>
效果:當使用get進行頁面訪問的時候,http://127.0.0.1:8000/detail-2-9.html,可獲取靜態詳情頁。
獲取到對應的nid,uid
後續:當傳輸的不止是,nid、uid 兩個數值,而是多引數正則分組時。又該如何去獲取傳輸的值?
對應關係,如下:
第一種對應關係: url 路由配置 url(r'^detail-(\d+)-(\d+).html',views.detail) views 函式處理方式有三種: def func(request,nid,uid): pass def func(request,*args): args = (2,9) def func(request,*args,**kwargs) args = (2,9) 第二種對應關係: url 路由配置 url(r'^detail-(?P<nid>\d+)-(?P<uid>\d+).html',views.detail) views 函式處理方式有三種: def func(request,nid,uid): pass def func(request,**kwargs): kwargs = ('nid':2,'uid'=9) def func(request,*args,**kwargs) args = (2,9)
4、舉例:路由分發 name 的使用 --- 對URL關係進行命名,以後可以根據此名稱生成自己想要的URL。
urls.py的配置檔案如下:
格式:
- 案例1:url(r'ffafafff/',views.index,name='i1');
- 案例2:url(r'yun/(\d+)/(\d+)/',views.index,name='i2');
- 案例3:url(r'buy/(?P<nid>\d+)/(?P<uid>\d+)/',views.index,name='i3');
案例:
from django.contrib import admin from django.urls import path from docker import views from django.conf.urls import url urlpatterns = [ path('admin/', admin.site.urls), path(r'ffafafff/',views.index,name='i1'), ]
views.py 的配置如下:
格式:
def fun(request,*args,**kwargs): from django.urls import reverse 案例1:url1 = reverse('i1') 案例2:url2 = reverse('i2',args=(1,2)) 案例3:url3 = reverse('i3',kwargs=("pid":2,"uid":9))
舉例:
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View def index(request,*args,**kwargs): from django.urls import reverse url1 = reverse('i1') #返回URL的 print(request.path_info) #獲取的的啊 return render(request,'login_1.html') #獲取到的網站資訊
login_1.html 模板語言的格式:
案例1:<form action="{% url "i1" %} " method="post" > #定義的URL字尾:ffafafff/
案例2:<form action="{% url "i2" 1 2 %} " method="post" > #定義的URL字尾:you/1/2
案例3:<form action="{% url "i2" pid=2 uid=9 %} " method="post" > #定義的URL字尾:buy/2/9
舉例:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="{% url "i1" %} " method="post" > <P> <a><input type="text" name="user" placeholder="使用者名稱"></a> </P> <p> <a><input type="password" name="pwd" placeholder="密碼"></a> </p> <p> <input type='submit' value="確認提交"/> </p> </form> </body> </html>
5、 一個Django工程,包括多個APP專案,如何做到每個自己的APP來處理自己的邏輯?
進到django專案的路徑下,建立app應用。執行命令:python3.5 manage.py startapp cmdb
對於多個APP應用的 urls.py 配置 如下:
django_2.urls.py:使用include的方式進行包裹,對應到不同的APP的路由。
from django.contrib import admin from django.urls import path from django.conf.urls import url,include urlpatterns = [ path('admin/', admin.site.urls), path(r'docker/', include("docker.urls")), path(r'cmdb/', include("cmdb.urls")), ]
docker APP專案配置如下:
docker.urls.py :對應的APP專案,有自己本身的URL及處理邏輯方法
from django.contrib import admin from django.urls import path from docker import views from django.conf.urls import url,include urlpatterns = [ path(r'login', views.login), ]
docker.views.py : 包含處理的邏輯, 這裡簡單設定為HttpResponse返回字元。
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View def login(request): return HttpResponse("docker")
cmdb APP專案配置如下:
cmdb.urls.py :對應的APP專案,有自己本身的URL及處理邏輯方法
from django.contrib import admin from django.urls import path from django.conf.urls import url,include from cmdb.views import login urlpatterns = [ path(r'login', login), ]
cmdb.views.py : 包含處理的邏輯, 這裡簡單設定為HttpResponse返回字元
from django.shortcuts import render,redirect from django.shortcuts import HttpResponse from django.views import View def login(request): return HttpResponse("cmdb")
測試訪問:
http://127.0.0.1:8000/docker/login 返回 docker
http://127.0.0.1:8000/cmdb/login 返回 cmdb
對應不一樣的處理邏輯,及返回不同結果。
~~ 以上 ~~