Django(5)-urls設計
Django Url設計 小知識點
mysite/news/urls.py:
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(r‘^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$‘, views.article_detail), ]
上面的代碼將URLs映射作為簡單的正則表達式映射到Python的回調函數(視圖)。正則表達式通過圓括號來“捕獲”URLs中的值。 當一個用戶請求一個頁面時,Django將按照順序去匹配每一個模式,並停在第一個匹配請求的URL上。 (如果沒有匹配到, Django將調用一個特殊的404視圖。)整個過程是極快的,因為正則表達式在加載時編譯。
一旦有一個正則表達式匹配上了,Django 將導入和調用對應的視圖,它其實就是一個簡單的Python函數。 每個視圖將得到一個request對象 —— 它包含了request 的meta信息 —— 和正則表達式所捕獲到的值。
例如,如果一個用戶請求了URL “/articles/2005/05/39323/”,Django將調用函數news.views.article_detail(request, ‘2005‘,‘05‘, ‘39323‘)
news.views.py中:
def article_detail(request,year, month, number):
......
調用“/articles/2005/05/39323/?day=Monday”, 參數與值得對應關系:
request.GET[‘day‘] == ‘Monday‘
year == 2005
month == 05
number == 39323
四、反向解析
在使用Django 項目時,一個常見的需求是獲得URL 的最終形式,以用於嵌入到生成的內容中(視圖中和顯示給用戶的URL等)或者用於處理服務器端的導航(重定向等)。
人們強烈希望不要硬編碼這些URL(費力、不可擴展且容易產生錯誤)或者設計一種與URLconf 毫不相關的專門的URL 生成機制,因為這樣容易導致一定程度上產生過期的URL。
換句話講,需要的是一個DRY 機制。除了其它有點,它還允許設計的URL 可以自動更新而不用遍歷項目的源代碼來搜索並替換過期的URL。
獲取一個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()
方法。
例子:
考慮下面的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路徑寫活了。
1、首先給url起一個別名。
2、然後在login.html中寫上{% url ‘別名’’ %} ,如果在頁面中點擊查看元素,它會變成login.html,,,當然我的是分發了,,就會變成test/login.html
3、這樣你就可以修改你的正則了,,因為他是按照別名走的,不會影響。
urls.py
login.html
查看元素的結果:
這樣的好處是:無論你怎麽改你要匹配的url,只要你寫上了別名。在html實現了模板語法,就會去找別名對應的那個url,以後不管你怎麽改url都沒事,就寫活了,就不像一開始寫的硬編碼了。
Django(5)-urls設計