1. 程式人生 > >8、第十 - WEB開發進階 - Django URL路由分發

8、第十 - WEB開發進階 - Django URL路由分發

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 

對應不一樣的處理邏輯,及返回不同結果。

~~ 以上 ~~