django之路由層

2022-04-10 17:33:09 字數 4875 閱讀 7543

1.django中urls.py負責url的路由分發

urlpatterns = [

url(r'^admin/', admin.site.urls),

]# url的第乙個引數實際為乙個正規表示式,第二個引數為檢視函式。瀏覽器訪問時,會遍歷該列表,匹配到則終止,不再往下匹配。

當使用者訪問的url不存在時,django會嘗試將使用者訪問的url後加上「/」,返回給瀏覽器,瀏覽器負責重定向。實際上進行了2次http請求。

例如訪問時,由於admin和r'^admin/'並不能匹配。django會重定向。

實際上不能這麼理解。如果按上述說法,將進行乙個死迴圈,匹配不到就新增"/"重定向,豈不是無窮無盡了? 這點,我們可以通過訪問乙個不存在的url得到證明。

django在收到url時會自動檢測有沒有「/」,

如果原本就有,則直接匹配,

- 匹配不到直接返回404。

- 匹配的到則呼叫檢視函式

如果原本沒有'/',則拿新增上'/'以後的url進行匹配。

- 如果匹配不到則直接返回404

- 如果匹配得則向瀏覽器傳送重定向的標誌。

# 證明例子

urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^index/',views.index),

url(r'^index',views.index1),

]訪問:時,按照第一種說法是呼叫index1,而事實上時呼叫的index。

2.有名分組和無名分組

分組就是在url匹配關係中給某一段正規表示式加了括號。當匹配成功後,會將括號內的內容作為引數傳入檢視函式。有名分組是以關鍵字傳參的方式,無名分組是以位置傳參的方式。

注意:在乙個匹配關係中,有名分組和無名分組不能混合使用!!!!

無名分組

urls.py

---------------------------

urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^edit_user/(\d+)/',views.edit_user),

]views.py

-----------------------------

def edit_user(request,id):

return httpresponse(id)

有名分組

urls.py

---------------------------

urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^edit_user/(?p\d+)/',views.edit_user),

]views.py

----------------------------

# 此處形參名必須與urls有名分組的名字一致

def edit_user(request,user_id):

return httpresponse(user_id)

補充,在乙個正則---檢視函式的匹配關係下,

1.有名分組和無名分組不能混合使用。

2.同一種分組方式可以使用多個。

3.反向解析

反向解析的需求由來:當我們在前端或者在後端時,在使用者做某些操作時希望頁面跳轉到我們指定的url,而一旦我們的url名字發生了改變,所有指定跳轉到該頁面的**都需要被修改。這時極為不便的,反向解析由此誕生。

反向解析的使用:反向解析實際上給每一組url----檢視函式的對應關係增加了乙個name的屬性,通過這個name屬性和前後端一些函式的使用,即可找到這種對應關係。

urls.py

---------------------------

urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^edit_user/',views.edit_user,name='edit'),

]

前端使用反向解析

---->即name='edit'所在的url
後端使用反向解析

from django.shortcuts import reverse

reverse('edit') ----->name='edit'所在的url

明白了反向解析的由來和使用後,我們再思考乙個問題。如果反向解析的url是乙個帶有有名分組或者無名分組的url呢?

無名分組的反向解析

urls.py

---------------------------

urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^edit_user/(\d+)/',views.edit_user,name='edit'),

]

前端

# 只需要在後面直接跟引數即可

後端

reverse('edit',args=(123,))

# args中放入引數

有名分組的反向解析

有名分組的反向解析與無名分組的反向解析基本一致。

urls.py

---------------------------

urlpatterns = [

url(r'^admin/', admin.site.urls),

url(r'^edit_user/(?p\d+)/',views.edit_user,name='edit'),

]

前端

# 以上兩種都可以使用,第一種使用時注意位置。

後端

reverse('edit',args=(1,))

reverse('edit',kwargs=)

# 以上兩種都可以使用,第一種注意位置

4.路由分發

這其中有兩個問題

非常多的urls對應關係,會使**顯得比較混亂

總路由

urls.py

--------------------

from django.conf.urls import url,include

urlpatterns = [

]

以上寫法可簡寫為:

urls.py

from django.conf.urls import url,include

urlpatterns = [

]

子路由

-----------------------

from django.conf.urls import url

urlpatterns = [

url(r'^index/',views.index)

]-----------------------

from django.conf.urls import url

urlpatterns = [

url(r'^index/',views.index)

]5.命名空間

為了避免上述問題的出現,我們可以在總路由系統下增加乙個命名空間的概念

]後端解析

前端解析

6.虛擬環境

虛擬環境是我們在開發不同的專案時,可以只載入針對本專案使用的模組,來加快載入資源時的速度。虛擬環境即乙個全新的python直譯器環境,有如剛重灌的系統一樣。

7.django版本的區別

路由層

1.x用的是url

2.x、3.x用的是path

url第乙個引數是乙個正規表示式

而path第乙個引數不支援正規表示式 寫什麼就匹配什麼

如果你覺得path不好用 2.x、3.x給你提供了乙個跟url一樣的功能

re_path 等價於1.x裡面的url功能

雖然path不支援正規表示式 但是它給你提供了五種預設的轉換器

str,匹配除了路徑分隔符(/)之外的非空字串,這是預設的形式

int,匹配正整數,包含0。

slug,匹配字母、數字以及橫槓、下劃線組成的字串。

uuid,匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00。

path,匹配任何非空字串,包含了路徑分隔符(/)(不能用?)

path('login//',login)

除了預設的五種轉換器之外 還支援你自定義轉換器

class monthconverter:

regex='\d' # 屬性名必須為regex

def to_python(self, value):

return int(value)

def to_url(self, value):

return value # 匹配的regex是兩個數字,返回的結果也必須是兩個數字

8.偽靜態
偽靜態

url以.html結尾 給人的感覺好像是這個檔案是寫死的 內容不會輕易的改變

偽靜態為了提高你的**被搜尋引擎收藏的力度 提供**的seo查詢效率

Django 之路由篇

django 之檢視篇 django 之 models models 模型 資料表關係 django 之模板篇 參考資料 pip install django 1.8 路由需要關注兩點 接受的url是什麼,即如何使用re對傳入url進行匹配 已知url匹配到哪個處理模組 url匹配規則 正則以r開頭...

Django之路由系統

url配置 urlconf 就像django所支撐 的目錄。它的本質是url與要為該url呼叫的檢視函式之間的對映表。我們就是以這種方式告訴django,遇到哪個url的時候,要對應執行哪個函式。django 1.11版本 urlconf官方文件 from django.conf.urls impo...

Django框架之路由

路由就是請求位址與檢視函式的對映關係 urls.py url index view.index djaogo框架中必會技能 正規表示式,檢視函式views.py def article request return render request,index.html 我們知道在正規表示式中是可以進行...