URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL與要爲該URL調用的視圖函數之間的映射表;你就是以這種方式告訴Django,對於客戶端發來的某個URL調用哪一段邏輯代碼對應執行。html
Django 2.+版本中 path路徑匹配的是字符串 , re_path路徑匹配的是正則匹配python
Django1.+版本 中 url 就是2.+版本中的 re_path和path 的結合體正則表達式
from django.contrib import admin from django.urls import path,re_path from app01 import views urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^$',views.index), # 含有正則匹配根路徑 path('shopping',views.shopping), # 不含正則使用path re_path(r'^active/(\d{4})/$',views.active), # 正則也可使用分組 ,匹配任意四位數字 如 active/1234/ re_path(r'^active/(\d{4})/(\d{2})/$') # 匹配任意年月日時間 如博客的日期 active/2016/09 ]
注意 : django
^articles
而不是 ^/articles
。
上面的示例使用簡單的、沒有命名的正則表達式組(經過圓括號)來捕獲URL 中的值並以位置 參數傳遞給視圖。在更高級的用法中,可使用命名的正則表達式組來捕獲URL 中的值並以關鍵字 參數傳遞給視圖。瀏覽器
在python 正則表達式中, 命名正則表達式組的語法是(?P<name>正則表達式), 其中 name 是組的名字 , 正則表達式 是要匹配的內容 , 服務器
from django.urls import path,re_path from app01 import views urlpatterns = [ re_path(r'^articles/2003/$', views.special_case_2003), re_path(r'^articles/(?P<year>\d{4})/$', views.year_archive), re_path(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_archive), re_path(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', views.article_detail), ]
這個實現與前面的示例徹底相同,只有一個細微的差異:捕獲的值做爲關鍵字參數而不是位置參數傳遞給視圖函數。例如:app
#/articles/2005/03/ 請求將調用views.month_archive(request, year='2005', month='03')函數,而不是views.month_archive(request, '2005', '03')。 #/articles/2003/03/03/ 請求將調用函數views.article_detail(request, year='2003', month='03', day='03')。 re_path(r'^artivels/(?P<year>\d{4})/(?P<month>\d{4})/$',views.artivels) # 把正則匹配分組命名 , 這個傳參含有 year=1234,mouth = 02 # 這個能夠獲取到匹配成功的數字, 利用獲取到的數字作其餘功能
在實際應用中,這意味你的URLconf 會更加明晰且不容易產生參數順序問題的錯誤 —— 你能夠在你的視圖函數定義中從新安排參數的順序。固然,這些好處是以簡潔爲代價;函數
# 分發include # re_path(r'^app01/', include('app01.urls')), # re_path(r'^app02/', include('app02.urls')),
在每一個視圖應用中到建立一個屬於本身的應用urls 只要匹配的屬於本身的應用,就直接到本身的url中找視圖函數工具
一、首先給url起一個別名。例如 : re_path(r'^article/(\d{4})/$,views.year_archive, name = "xxx"') xxx就是一個名字網站
二、而後在login.html中寫上{% url ‘別名’’ %} ,若是在頁面中點擊查看元素,它會變成login.html,,,固然個人是分發了,,就會變成test/login.html
三、這樣你就能夠修改你的正則了,,由於他是按照別名走的,不會影響。
在使用Django 項目時 , 一個經常使用的需求是得到URL 的最終形式 ,已用嵌入到生成的內容中(視圖中和顯示給用戶的URL等) 或者用於處理服務器端的導航(重定向等) 人們強烈但願 不要硬編碼這些URL (費力,不可擴展且容易產生錯誤) 或者設計一種與URLconf 絕不相關的專門的URL 生成機制,由於這樣容易致使必定程度上產生過時的URL。
換句話講,須要的是一個DRY 機制。除了其它有點,它還容許設計的URL 能夠自動更新而不用遍歷項目的源代碼來搜索並替換過時的URL。
獲取一個URL 最開始想到的信息是處理它視圖的標識(例如名字),查找正確的URL 的其它必要的信息有視圖參數的類型(位置參數、關鍵字參數)和值。
Django 提供一個辦法是讓URL 映射是URL 設計惟一的地方。你填充你的URLconf,而後能夠雙向使用它:
第一種方式是咱們在前面的章節中一直討論的用法。第二種方式叫作反向解析URL、反向URL 匹配、反向URL 查詢或者簡單的URL 反查。
在須要URL 的地方,對於不一樣層級,Django 提供不一樣的工具用於URL 反查:
django.core.urlresolvers.reverse()
函數。get_absolute_url()
方法。
例子:
考慮下面的URLconf:
from django.conf.urls import url from . import views urlpatterns = [ #... url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'), #... ]
根據這裏的設計,某一年nnnn對應的歸檔的URL是/articles/nnnn/
。
你能夠在模板的代碼中使用下面的方法得到它們:
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a> <ul> {% for yearvar in year_list %} <li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li> {% endfor %} </ul>
在Python 代碼中,這樣使用:
from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect def redirect_to_year(request): # ... year = 2006 # ... return HttpResponseRedirect(reverse('news-year-archive', args=(year,)))
若是出於某種緣由決定按年歸檔文章發佈的URL應該調整一下,那麼你將只須要修改URLconf 中的內容。
在某些場景中,一個視圖是通用的,因此在URL 和視圖之間存在多對一的關係。對於這些狀況,當反查URL 時,只有視圖的名字還不夠。
例子中:
分析:想咱們一開始寫的硬編碼,也就是吧action要跳轉的路徑寫死了。可是像淘寶,天貓等都會常常更新新東西,,那麼你的頁面上的url路徑也會時不時的變化。可是若是有特別多的商品,那麼你就得去服務端一個一個的改,這樣顯得很麻煩,那麼有沒有一種機制幫咱們解決問題呢?那就按照我下面的辦法解決。就把url路徑寫活了。
一、首先給url起一個別名。
二、而後在login.html中寫上{% url ‘別名’’ %} ,若是在頁面中點擊查看元素,它會變成login.html,,,固然個人是分發了,,就會變成test/login.html
三、這樣你就能夠修改你的正則了,,由於他是按照別名走的,不會影響。
urls.py
login.html
查看元素的結果:
這樣的好處是:不管你怎麼改你要匹配的url,只要你寫上了別名。在html實現了模板語法,就會去找別名對應的那個url,之後無論你怎麼改url都沒事,就寫活了,就不像一開始寫的硬編碼了。