13.Django之url路由系統初探(一)

1、什麼是django中的url路由系統?
django中的url路由系統的本質就是簡歷某個URL與某個視圖(view)函數的對應(映射表)關係表,用下面這種特定的方式來告訴django這個web框架,哪一個url能夠去調用哪段python代碼。html

urls.pypython

urlpatterns = [
     url(正則表達式, views視圖函數,參數,別名),

]
正則表達式:一個用來表示正則表達式的字符串。
views視圖函數:通常用來傳一個可調用對象(視圖函數)。
參數(可選):用來傳遞給視圖函數的參數(字典形式)。web

例:
from django.conf.urls import url
from . import views正則表達式

urlpatterns=[
url(r'^datetime/',views.show_datetime),
url(r'^login/',views.auth_user),
url(r'^admin/',views.admin),
]django

2、正則與url路由系統。
from django.conf.urls import url瀏覽器

from . import viewsapp

urlpatterns = [
url(r'^test/2008/$', views.special_case_2008),
url(r'^test/([0-9]{4})/$', views.year_archive),
url(r'^test/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^test/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]框架

下面來講下django url匹配的規則:
1.一旦匹配成功,則不會向下繼續進行匹配。
2.若想從url中獲取到參數,或者一個值,須要加括號()分組。
就像r'^test/([0-9]{4})/([0-9]{2})/$。
3.在匹配url的正則表達式中,不須要添加一個前置反斜槓!
例如:^test而不是/^test 。!!ide

下面是客戶端向服務端發起請求的一些示例:
/test/2008/1/ 這種訪問方式不會匹配任何到任何URL 規則,由於列表中的第三個模式要求月份應該是兩個數字。函數

/test/2008/ 將會匹配到urls.py中urlpatterns的列表中的第一個url規則不是第二個,由於規則按順序匹配,若是第一條規則成功匹配,則再也不繼續向下匹配了。

/test/2008/01/ 這個請求將匹配列表中的第三條規則。Django 將調用名爲views.month_archive的視圖函數,不過須要注意的是,2008和01則會當作參數,傳入views.month_archive這個視圖函數中。

3、url路由中正則的有名分組。
前面介紹的是比較簡單的,沒有命名的正則表達式,而是經過括號來捕捉url中用來傳給視圖函數的值。而命名分組是更高級的用法,經過使用命名的正則表達式來捕捉url中的關鍵字做爲參數傳遞給視圖函數。

在python這門語言中,命名正則表達式的寫法是(?P<name>pattern)。
name指的是分組名稱。
patterm指的是要匹配的正則表達式。

接下來咱們使用分組正則表達式,將以前的url路由規則重寫:
from django.conf.urls import url

from . import views

urlpatterns = [
url(r'^test/2008/$', views.special_case_2008),
url(r'^test/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^test(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^test/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

這種使用分組正則表達式與以前的寫法不一樣的是,從客戶端請求url中捕捉到的關鍵值將做爲關鍵字參數傳給視圖函數,而不是位置參數!!!!
例如:
/tesrt/2008/01/
請求將調用views.month_archive(request, year='2008', month='01')函數
/test/2008/01/01/
請求將調用函數views.article_detail(request, year='2008', month='01', day='01')。

django中的url路由系統是在請求的URL 上查找,將它當作一個普通的Python 字符串。不包括GET和POST參數以及域名。

例如,http://www.example.com/myapp/ 請求中,URLconf 將查找myapp/。

在http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找myapp/。

URL路由系統不檢查請求的方法。換句話講,全部的請求方法 —— 同一個URL的POST、GET、HEAD等等 —— 都將路由到相同的函數。
每一個捕獲的參數都做爲一個普通的Python 字符串傳遞給視圖,不管正則表達式使用的是什麼匹配方式。

四.經過name參數來生成url路徑。
經過name參數來生成指定的url!!!
url路由系統中的name參數,主要的做用是對URL路由關係進行命名,之後能夠根據此名稱經過reverse或者模板語言生成本身想要的URL。
下面是一個對name參數的使用示例:
from django.conf.urls import include,url
from django.contrib import admin

urlpatterns = [
url(r'^test/', views.index, name='url1'),
url(r'^main/(\d+)/(\d+)/', views.index, name='url2'),
url(r'^buy/(?P<pid>\d+)/(?P<nid>\d+)/', views.index, name='url3'),
]
‘======================================================
#在上面的url路由系統中,一共有三條url規則,這三條url路由規則都使用了name參數進行了命名,首先咱們先使用reverse函數來獲取咱們以前命名的url。
from django.urls import reverse
#首先要先將reverse函數進行導入。
def url_test(request):
u1 = reverse('url1') #經過reverse函數去獲取以前給url命名的名字。
u2 = reverse('url2',args=(1,2)) #經過reverse函數去獲取以及生成url路徑
u3 = reverse('url3',kwargs={'pid':'01','nid':'03'}) #經過reverse函數去獲取以及生成url路徑
return HttpResponse(u1)
#此時u1 = '/test/'
#u2 = '/main/1/2/'
#u3 = '/buy/01/03/'

一樣的,這種經過name參數生成的url路徑還能夠在django的模板語言中實現,下面是模板語言生成url的示例:
{% url "i1" %} # test/
{% url "i2" 1 2 %} # main/1/2/
{% url "i3" pid=1 nid=2 %} # buy/1/2/

下面是一個url路徑生成在模板中的應用實例:
(1)urls.py:
urlpatterns = [
url(r'^index',views.index,name='MAIN'),

]
下面是html代碼以及form表單。
13.Django之url路由系統初探(一)

補:
1.在settings.py中,有一個參數能夠用來設置開啓或者關閉,當訪問一個url地址後,是否跳轉到帶有/的url路徑。
這個參數就是APPEND_SLASH = True
(當APPEND_SLASH的值爲True時,當客戶端訪問某個url後,自動跳轉到url路由規則中的某個帶有/的規則,爲False則不會跳轉。)
例1:
views.py
from django.conf.urls import url
from . import views

urlpatterns=[
url(r'^datetime/',views.show_datetime),
url(r'^login/',views.auth_user),
url(r'^admin/',views.admin),
]
這裏有三條url規則。
當客戶端的瀏覽器發起請求訪問 http://127.0.0.1/datetime 這個url時,APPEND_SLASH = True 時會自動跳轉到http://127.0.0.1/datetime/,
當APPEND_SLASH = False 時,則不會跳轉,客戶端訪問的url依舊爲http://127.0.0.1/datetime 。

2.url對應view中的默認參數示例:
from django.conf.urls import url

from . import views

urlpatterns = [
url(r'^blog/$', views.page),
url(r'^blog/page(?P<num>[0-9]+)/$', views.page),
]

View (in blog/views.py)

def page(request, num="1"):

在上面的例子中,兩個URL規則指向同一個視圖views.page —— 可是第一個規則不會從URL 中捕獲任何值。若是第一個規則匹配,page() 函數將使用num參數的默認值"1"。若是第二個模式匹配,page() 將使用正則表達式捕獲的num 值!!

3.引入其餘的url路由規則。

from django.conf.urls import include,url
from django.contrib import admin

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^test/',include('app01.urls'))
]

4.url路由 給view視圖函數傳遞額外參數。
說的通俗一些,就是傳遞一個Python 字典做爲額外的參數傳遞給視圖函數。
django.conf.urls.url() 函數能夠接收一個可選的第三個參數,它是一個字典,表示想要傳遞給視圖函數的額外關鍵字參數。

例:
from django.conf.urls import url
from . import views

urlpatterns = [url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),]在這個例子中,對於/blog/2005/請求,Django 將調用views.year_archive(request, year='2005', foo='bar')。

相關文章
相關標籤/搜索