2 django urls路由系統基本使用

2022-01-16 15:49:24 字數 4659 閱讀 1232

目錄1.3 urlconf 在什麼上查詢

1.4 include(路由分發)

1.5 別名(name引數)

1.6 反推url

1.7 命名空間

url控制其實就是把不同的url對應到不同的views函式中去

格式:

# 專案目錄下的urls.py檔案中

urlpatterns = [

url(regex, view, kwargs=none, name=none)

... ...

]

url可以有多個,每個url都是乙個獨立的規則。

引數如下:

url的第乙個引數為正規表示式,所以常用的正規表示式符號都可以進行匹配

urlpatterns = [

url(r'^articles/2003/$', views.special_case_2003),

url(r'^articles/[0-9]/$', views.year_archive),

url(r'^articles/([0-9])/([0-9])/$', views.month_archive), # 傳遞兩個位置引數

url(r'^articles/([0-9])/([0-9])/([0-9]+)/$', views.article_detail), # 傳遞三個位置引數

]這裡對url表示式使用括號,表示取出匹配到的路徑字串(分組)

注意:在url正規表示式上加上括號,就表示對括號內的元素進行取出,然後傳給後面的views函式,根據傳遞引數的方式不同,分為無名分組有名分組:

若要從url中捕獲乙個值,只需要在它周圍放置一對圓括號。

只需要把要分組的正則字串用括號括起來即可。這樣,括號內的匹配的內容會當作位置引數傳遞給後面指定的views函式。

urlpatterns = [

url(r'^articles/([0-9])/([0-9])/$', views.year_month),]

# ([0-9]) 第乙個位置引數

# ([0-9]) 第二個位置引數

views函式需要定義位置引數來一一對應,否則將會丟擲typeerror異常

即捕獲url中的乙個值時,並賦予其名稱,使用關鍵字引數來進行傳遞。在python 正規表示式中,命名正規表示式組的語法是(?ppattern),其中 name 是組的名稱,pattern 是要匹配的模式。

urlpatterns = [

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

url(r'^index/(?p201[0-9])', user.views.index)

]# 會把 當作關鍵字引數

這種方式可以在views中的處理函式內,直接定義關鍵字變數來接受,而不用在意引數的位置。

def index(request,year):

... ...

如果year沒有捕獲到資料,那麼views函式index將會報錯,所以我們一般可以在index中為year,配置預設值來避免這種錯誤。當然也可以在urls內,指定預設引數

url(r'^index/year(?p[0-9]?)', user.views.index, )
但是這樣就把前面匹配到的year的值給覆蓋了。請慎重選用

請求的url被看做是乙個普通的python 字串, urlconf在其上查詢並匹配。進行匹配時將不包括get或post請求方式的引數以及網域名稱。

例如:urlconf 不檢查使用了哪種請求方法。換句話講,所有的請求方法,即對同乙個url的無論是 post請求、get請求、或是head請求方法等等,都將路由到相同的函式。

當專案中的應用變得越來越多的時候,如果所有的應用的url都通過專案的urls統一進行分配,那麼耦合度會很高,另外也不利於管理,所以這裡通過include來交給應用的urls來處理。

# 專案的urls.py

from django.conf.urls import include, url

urlpatterns = [

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

url(r'^user/', include('user.urls')),]

# 通過include 來指定交給那個應用的urls來處理

# include 包涵在 django.conf.urls中

在應用user下建立urls.py檔案,寫入

from django.conf.urls import url

from user import views

urlpatterns = [

url('^login', views.login)

]

注意:路由分發後,子路徑的起始位置就從分發的url開始了。上面匹配到的路徑為:user/login

當我們在做路徑匹配然後配合form表單等需要提交的資料的元素的時候會遇到以下問題

#urls.py

urlpatterns = [

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

url(r'^login/', views.login), # 匹配路徑

]

返回的頁面檔案:

如果我們某一天改了url匹配的路徑,那麼,就緒要修改頁面中所有的提交路徑,否則將會提交失敗.而url的name就是解決這個問題的。

urlpatterns = [

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

url(r'^login/$', views.login,name='login'), # 新增name關鍵字

]

返回的html檔案如下

這樣就算url後期更改,也會動態指向最新的url。

# --------------------------- url ---------------------------

from django.conf.urls import url

from django.contrib import admin

urlpatterns = [

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

url(r'^abc/(\d+)/', views.login,name="login"),]

# -------------------------- teamplates ---------------------------

什麼叫反推url?在views函式中,如果想要獲取當前函式對應的url,該怎麼辦呢?還記得前面的name屬性嗎,反推url就是在views中根據name屬性的值,獲得對應的url

from django.urls import reverse

url = reverse('name')

當然reverse還有兩個引數(args,kwargs)

args = ()

kwargs = {}

# 引數是配合urls中的正規表示式的

url('^detail/(\d+)' ,name='i1',views.detail) -- > reverse('i1',args=(10,))

# 反推的url為: detail/10

# kwargs則表示在命名關鍵字的情況下

url('^detail/(?p\d+)' ,name='i2',views.detail) -- > reverse('i1',kwargs=)

# 反推的url為: detail/10

還有乙個方法是利用request物件的path_info,因為其中存放的是使用者提交的url。

當在url(路由系統)中使用了include時,在views函式中,我們就無法單獨的利用name引數來反推url了,因為在include時,是無法使用name關鍵字的,不過django提供了其他關鍵字提供類似功能:namespace,稱作命名空間。

# urls.py

url = [

url(r'crm/',include('crm.urls'),namespace='crm'),

url(r'cmdb/',include('cmdb.urls'),namespace='cmdb'),]

# crm 中的 urls.py

url = [

url(r'index/',views.index,name='index'),]

# crm 中的views.py

def test(request):

url = reverse('crm:index') # 這裡通過namespace:name 來反向獲取url

print(url)

return httpresponse(200)

ps:在html中,通過 也是通過namespace:name來獲取url的。

Django urls 路由系統

fbv 寫法 url r admin admin.site.urls admin 後台管理 對應 檢視中的函式 url r login views.login,name login 正則分組 url r del student teacher class d views.delete,name de...

django 2 x路由系統匹配path

django2.x路由系統已經替換成下面的寫法 官方文件 url的路由表示用path和re path代替,模組的匯入由django1.x版本的 from django.conf.urls import url,include變成現在的django2.x中的 from django.urls impo...

Django路由系統

urlpatterns path 要匹配的路徑 可以是正規表示式 檢視函式,引數,別名 1 正規表示式 乙個正規表示式字串 2 檢視函式 乙個可呼叫物件,通常為乙個檢視函式或乙個指定檢視函式路徑的字串 3 引數 要傳遞給檢視函式的預設引數 字典形式,可選 4 別名 乙個可選的name引數 1 在py...