一、 URLconf配置 1. 基本格式 參數說明 正則表達式:一個正則表達式字元串 views視圖:一個可調用對象,通常為一個視圖函數 參數:可選的要傳遞給視圖函數的預設參數(字典形式) 別名:一個可選的name參數 2. django 2.0版本的路由系統 2.0版本中re_path和1.11版 ...
一、 URLconf配置
基本格式
from django.conf.urls import url urlpatterns = [ url(正則表達式, views視圖,參數,別名), ]
- 參數說明
- 正則表達式:一個正則表達式字元串
- views視圖:一個可調用對象,通常為一個視圖函數
- 參數:可選的要傳遞給視圖函數的預設參數(字典形式)
- 別名:一個可選的name參數
- 參數說明
django 2.0版本的路由系統
- 2.0版本中re_path和1.11版本的url是一樣的用法
from django.urls import path,re_path urlpatterns = [ path('articles/2003/', views.special_case_2003), ]
二、 正則表達式
基本配置
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/2003/$', views.special_case_2003), ]
註意事項
- urlpatterns中的元素按照書寫順序從上往下逐一匹配正則表達式,一旦匹配成功則不再繼續
- 若要從URL中捕獲一個值,只需要在它周圍放置一對圓括弧(利用分組匹配)
- 不需要添加一個前導的反斜杠,因為每個URL 都有。例如,應該是^articles 而不是 ^/articles
- 每個正則表達式前面的'r' 是可選的但是建議加上
補充說明
- 是否開啟URL訪問地址後面不為/跳轉至帶有/的路徑的配置項:APPEND_SLASH=True
- Django settings.py配置文件中預設沒有 APPEND_SLASH 這個參數,但 Django 預設這個參數為 APPEND_SLASH = True,其作用就是自動在網址結尾加'/'
三、 分組命名匹配
分組:使用簡單的正則表達式分組匹配(通過圓括弧)來捕獲URL中的值並以位置參數形式傳遞給視圖函數
from django.conf.urls import url from . import views urlpatterns = [ url(r'^articles/([0-9]{4})/$', views.year_archive), url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), ]
命名分組:使用分組命名匹配的正則表達式組來捕獲URL中的值並以關鍵字參數形式傳遞給視圖函數
from django.conf.urls import url from . import views urlpatterns = [ 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的第三個參數時一個字典,表示想要傳遞給視圖函數的額外關鍵字參數
- 當傳遞額外參數的字典中的參數和URL中捕獲值的命名關鍵字參數同名時,函數調用時,將使用的是字典中的參數,而不是URL中捕獲的參數
- 即優先順序:額外參數 > URL捕獲參數
- 補充:url的第三個參數時一個字典,表示想要傳遞給視圖函數的額外關鍵字參數
UPLconf匹配的位置:
- 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等),都將路由到相同的函數
- URLconf 在請求的URL 上查找,將它當做一個普通的Python字元串,不包括GET和POST參數以及功能變數名稱
捕獲的參數都是字元串:每個在URLconf中捕獲的參數都作為一個普通的Python字元串傳遞給視圖函數,無論正則表達式使用的是什麼匹配方式
有個別情況,需要視圖函數指定預設值
# 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), ] # 兩個URL模式指向相同的view,但是第一個模式並沒有從URL中捕獲任何東西 # views.py中,可以為num指定預設值 def page(request, num="1"): pass # 如果第一個模式匹配上了,page函數將使用其預設參數num=“1”,如果第二個模式匹配,page將使用正則表達式捕獲到的num值
include:路由分發
- 根據功能或種類的不同,可以把不同的功能的路由寫在該功能的app文件下,利用include聯繫起來,相當於把不同功能的url放在不同的空間里
from django.conf.urls import include, url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/', include('app01.urls')), # 可以包含其他的URLconfs文件 ]
- 補充:app01.urls
from django.conf.urls import url from . import views urlpatterns = [ url(r'^blog/$', views.blog), url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})/$', views.blogs), ]
- include有一個命名空間的參數:namespace
- 便於區分不同路由空間中存在的同名函數,利於指定到確切的函數
from django.conf.urls import include, url urlpatterns = [ url(r'^app01/', include('app01.urls', namespace='app01')), url(r'^app02/', include('app02.urls', namespace='app02')), ]
四、URL的命名和反向解析
4.1 URL命名
url的第四個參數是起一個別名,即一個可選的name參數
命名方式:name = '別名'
from django.conf.urls import url urlpatterns = [ url(r'^home', views.home, name='home'), # 給我的url匹配模式起名為 home url(r'^index/(\d*)', views.index, name='index'), # 給我的url匹配模式起名為index ]
4.2 反向解析
反向解析:通過別名獲取完整URL路徑
情況一:靜態路由
- 命名
from django.conf.urls import url urlpatterns = [ url(r'^blog/$', views.blog, name='blog'), ]
- 模板中使用
{% url 'blog' %} {# 完整URL路徑:/blog/ #}
- py文件中使用
from django.urls import reverse reverse('blog') # 完整URL路徑:/blog/
情況二:分組
- 命名
from django.conf.urls import url urlpatterns = [ url(r'^blog/([0-9]{4})/(\d{2})/$', views.blogs, name='blogs'), ]
- 模板中使用
{% url 'blogs' 2222 12 %} {# 完整URL路徑:/blog/2222/12/ #}
- py文件中使用
from django.urls import reverse reverse('blogs',args=('2019','06')) # 完整URL路徑:/blog/2019/06/
情況三:命名分組
- 命名
from django.conf.urls import url urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})$', views.blogs, name='blogs'), ]
- 模板中使用
{% url 'blogs' year=2222 month=12 %} {# 完整URL路徑:/blog/2222/12/ #}
- py文件中使用
from django.urls import reverse reverse('blogs',kwargs={'year':'2019','month':'06'}) # 完整URL路徑:/blog/2019/06/
五、 命名空間模式下的反向解析
項目目錄下的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 urlpatterns = [ url(r'^(?P<pk>\d+)/$', views.detail, name='detail') ]
app02中的urls.py
from django.conf.urls import url from app02 import views urlpatterns = [ url(r'^(?P<pk>\d+)/$', views.detail, name='detail') ]
反向解析語法:'命名空間名稱:URL名稱'
- 在模板中的使用方式
{% url 'app01:detail' pk=12 %} {% url 'app02:detail' pk=12 %}
- 在py文件中的使用方式
from django.urls import reverse reverse('app01:detail', kwargs={'pk':11}) reverse('app01:detail', kwargs={'pk':11})
註意:如果有多層路由分發,有了多個命名空間名稱,都要把命名空間名稱一層一層加在別名前面
{# 簡單示例:app01是第一層路由空間的namespace,xxx是第二層路由空間的namespace #} {% url 'app01:xxx:index' %}