URl配置(URLconf)就像Django所支撐網站的目錄,它的本質是URL與該URL調用的視圖函數之間的映射關係正則表達式
基本格式django
from django.conf.urls import url
urlpatterns = [
url(正則表達式, views視圖,參數,別名),
]
參數說明:瀏覽器
正則表達式:一個正則表達式字符串服務器
views視圖: 一個可調用對象,一般爲一個視圖函數\參數: 可選的要傳遞給視圖函數的默認參數(字典形是)app
別名: 一個可選的name參數函數
2.0版本的django格式工具
from django.urls import path,re_path
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<int:year>/', views.year_archive),
path('articles/<int:year>/<int:month>/', views.month_archive),
path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),
]
其中re_path與1.11版本的url是同樣的用法網站
基本配置url
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
注意事項spa
urlpatterns中的元素哪找書寫順序從上往下逐一匹配正則表達式,一旦匹配成功就不在繼續
若要從URL中捕獲一個值,只須要在它的周圍放置一對圓括號<>(分組匹配)
不須要添加提個前導的反斜槓,由於每一個URL都有,例如應該是^articles而不是^/articles
每一個正則表達式前面的'r'是可選的,可是建議加上
補充說明
APPEND_SLASH=True
django settings.py配置文件中沒有這個參數,可是Django默認這個參數爲True,其做用就是自動的在網址的末尾加"/「
若是設定其爲False,當訪問網頁時不本身加" / ",就會提示找不到該頁面
分組匹配使用簡單的正則表達式經過圓括號來捕獲URL中的值並以位置參數的形式傳遞給視圖,
更高級的是以分組命名匹配的正則表達式來捕獲URl的值,並以關鍵字參數的方式傳遞給視圖
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
與前面的示例的不一樣就在於捕獲的值做爲關鍵字參數而不是位置參數傳遞給視角函數
例如,針對URL /articles/2017/12/至關於按如下方式調用視圖函數:
views.month_archive(request, year="2017", month="12")
優勢:讓你的URLconf更加清晰明確且不容易產生參數順序問題的錯誤,
缺點: 語法犯了罪,由於醜是原罪
URLconf匹配的位置
URLconf在請求的URL上查找,將它當作一個普通的Python字符串,不包括GET和POST參數以及域名
例如,http://www.example.com/myapp/ 請求中,URLconf 將查找 /myapp/ 。
在http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找 /myapp/ 。
URLconf 不檢查請求的方法。換句話講,全部的請求方法 —— 同一個URL的POST
、GET
、HEAD
等等 —— 都將路由到相同的函數。
捕獲的參數永遠都做爲一個普通的字符串傳遞給視圖,不管正則表達式用什麼匹配方式
視圖函數中指定默認值
# urls.py中
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),
]
# views.py中,能夠爲num指定默認值
def page(request, num="1"):
pass
在上面的例子中,兩個URl模式指向的是同一個視圖函數,可是第一個模式沒有捕獲任何東西,當他匹配上了,默認num = '1',若是第二個模式匹配上了,num將等於正則表達式捕獲到的num值
傳遞額外的參數給視圖參數
URLconfs 具備一個鉤子,讓你傳遞一個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'}),
]
能夠找到其餘app下的URLconf
include其餘的URLconfs
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('app01.urls')), # 能夠包含其餘的URLconfs文件
]
使用Django項目時,一個常見的需求就是獲取URl的最終形式,以用於嵌入到生成的內容中(視圖中和顯示給用戶的URl等,或用於處理服務器端的導航(重定向)
Django提供一個方法是讓URL映射是URl設計惟一的地方,你填充你的URLconf,而後能夠雙向使用他:
根據用戶/瀏覽器發起的URL請求,它調用正確的Django視圖,並從URL中提取它的參數須要的而值
根據Django視圖的標識和將要傳遞給它的參數的值,獲取與之關聯的URL,這就是反向解析URL,反向URL匹配,反向URL查詢或簡單的URL反查
在須要URL的地方,對於不一樣的層級,Django提供了不一樣的工具用於URL反查
在模板中:使用URL模板標籤
在Python代碼中:使用django.core.urlresolvers.reverse() 函數。
在更高層的與處理Django相關模型實例相關代碼中,使用get_absolute_url()方法
總結:簡單的說就是能夠給咱們的URL匹配規則起一個名字,一個規則一個名字,這樣就能夠經過名字來調用當前的URL
例如:
url(r'^home', views.home, name='home'), # 給個人url匹配模式起名爲 home
url(r'^index/(\d*)', views.index, name='index'), # 給個人url匹配模式起名爲index
在模板中能夠這樣用
{% url 'home' %}
在views函數中能夠這樣引用
from django.urls import reverse
reverse("index", args=("2018", ))
在某些場景中,一個視圖是能夠通用的,因此在URL和視圖之間存在一對多的關係,對於這些狀況,只有視圖的名字還不厚
注意
爲了完成上面例子中的URL 反查,你將須要使用命名的URL 模式。URL 的名稱使用的字符串能夠包含任何你喜歡的字符。不僅限制在合法的Python 名稱。
當命名你的URL 模式時,請確保使用的名稱不會與其它應用中名稱衝突。若是你的URL 模式叫作comment
,而另一個應用中也有一個一樣的名稱,當你在模板中使用這個名稱的時候不能保證將插入哪一個URL。
在URL 名稱中加上一個前綴,好比應用的名稱,將減小衝突的可能。咱們建議使用myapp-comment
而不是comment
。
即便在不一樣APP使用相同的URL名稱,URL的命名空間模式也可讓你惟一反轉命名的URL
語法:
'命名空間名稱:URL名稱'
模板中使用:
{% url 'app01:detail' pk=12 pp=99 %}
views中的函數中使用
v = reverse('app01:detail', kwargs={'pk':11})
這樣即便app中URL的命名相同,我也能夠反轉獲得正確的URL了。