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 我們知道在正規表示式中是可以進行...