from django.conf.urls import url urlpatterns = [ url(正則表達式, views視圖函數,參數,別名), ]
正則表達式:一個正則表達式字符串
views視圖函數:一個可調用對象,一般爲一個視圖函數或一個指定視圖函數路徑的字符串
參數:可選的要傳遞給視圖函數的默認參數(字典形式)
別名:一個可選的 name 參數
正則表達式的模糊匹配
分組匹配 () --> 至關於給視圖函數傳遞位置參數
分組命名匹配 (?P<name>正則表達式) --> 至關於給視圖函數傳遞關鍵字參
注意:
1. 分組匹配和分組命名匹配不能混合使用html
2. URLconf 匹配的位置 : 無視域名和參數python
http://www.example.com/myapp/ 請求中,URLconf 將查找myapp/。 http://www.example.com/myapp/?page=3 請求中,URLconf 仍將查找myapp/。
3. URLconf 不檢查請求的方法 正則表達式
4. 捕獲的參數永遠都是字符串django
5. 視圖函數中可指定默認值app
# 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
from django.urls import re_path from app01 import views urlpatterns = [ re_path(r'articles/2003/$', views.special_case_2003), # 靜態路由
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), # 動態路由 re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # 動態路由 re_path(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<slug>[\w-]+)/$', views.article_detail), # 動態路由 ]
注意事項函數
- urlpatterns中元素按照從上往下逐一匹配正則表達式,匹配成功則再也不繼續
- 若要從URL中捕獲一個值,只須要在它周圍放置一對圓括號(分組匹配)
- 最前面不須要加一個反斜線
- 每一個正則表達式前面的'r' 是可選的可是建議加上
補充說明url
# 是否開啓URL訪問地址後面不爲/跳轉至帶有/的路徑的配置項 APPEND_SLASH=True
Django settings.py配置文件中默認沒有 APPEND_SLASH 這個參數spa
系統默認爲True, 其做用就是自動在網址結尾加 '/'code
# urls.py: from django.conf.urls import url from app01 import views urlpatterns = [ url(r'^blog/$', views.blog), ] # 訪問 http://www.example.com/blog 時,默認將網址自動轉換爲 http://www.example/com/blog/ 。 # 若是在settings.py中設置了 APPEND_SLASH=False, # 此時咱們再請求 http://www.example.com/blog 時就會提示找不到頁面。
(?P<name>pattern)
捕獲的值做爲關鍵字參數而不是位置參數傳遞給視圖函數htm
示例
# urls中: url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
# views中: views.month_archive(request, year="2017", month="12")
引入其餘 urls.py 文件
當多個app的時候能夠再 各app內部建立本身 urls.py
在總的urls 中須要 導入分流的各app內部的urls.py
from django.cinf.url import url,include
當請求來了由主urls進行匹配,匹配到子urls後由子urls進行下一步匹配
示例
from django.conf.urls import include, url from app01 import url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/', include('app01.urls')), # 能夠包含其餘的URLconfs文件 ]
# 當一個 app01/xxxx 的路徑請求來了以後 會首先匹配到 ^app01/ 然後轉向 app01.url 繼續下一步匹配
本質上就是給url匹配模式起別名,而後用過別名拿到具體的URL路徑
在url匹配模式中,定義name="別名"
url(r'^home', views.home, name='home'), # 給url匹配模式起名爲 home url(r'^index/(\d*)', views.index, name='index'), # 給url匹配模式起名爲index
1. 模板語言中:
// 直接取到路徑 {% url "別名" %} // 經過別名拿到具體路徑 // 若是urls中有位置參數或者關鍵字參數 {% url "別名" 2018 "nb" %}
2. 視圖函數中
# 首先要導入 django.utils import reverse # 直接取到路徑: reverse("別名") # 經過別名拿到具體路徑 # 若是urls中有位置參數或者關鍵字參數,依然能夠傳值 # 傳位置參數: reverse("別名", args=(2018, "nb")) # 傳關鍵字參數: reverse("別名" kwargs={"year": 2018, "title": "nb"})
即便不一樣的APP使用相同的URL名稱,URL的命名空間模式也可讓你惟一反轉命名的URL
# project中的urls.py from django.conf.urls import url, include urlpatterns = [ url(r'^app01/', include('app01.urls', namespace='app01')), url(r'^app02/', include('app02.urls', namespace='app02')), ] # app01中的urls.py from django.conf.urls import url from app01 import views app_name = 'app01' urlpatterns = [ url(r'^(?P<pk>\d+)/$', views.detail, name='detail') ] # app02中的urls.py from django.conf.urls import url from app02 import views app_name = 'app02' urlpatterns = [ url(r'^(?P<pk>\d+)/$', views.detail, name='detail') ]
app01 和 app02 中都有相同的 別名 "detail"
boss 打滾ing : 我就是想要同樣的
在用別名回調url的時候會衝突, 此時須要另外一種方式進行區分
爲了區分,在總的 urls 上作命名空間,
在原有的別名基礎上須要加上命名空間的預約值才能夠正確取到路徑
// 模板中使用: {% url 'app01:detail' pk=12 pp=99 %} # views中的函數中使用 v = reverse('app01:detail', kwargs={'pk':11})