2012-06-04 66 views
7

我有一些問題,在urls.py正則表達式(我是一個初學者的Django以及一般的正則表達式)django中的urls.py正則表達式評估順序是什麼?

這是我原來的urls.py

url(r'^name/(?P<name>\w+)/$', 'course.views.name'), 
url(r'^', 'course.views.index'), 

我試着用來訪問它的:

http://127.0.0.1:8000/name/blah/ 

我的看法是這樣的:

def index(request): 
    return HttpResponse("Hello, sam. You're at the course index.") 

def name(request, name): 
    return HttpResponse("Hello, %s. You're at the course index." % name) 

我得到的結果是,無論我給了什麼輸入,我都會定期獲得「索引」功能,而不是「名稱」功能。我認爲問題出在第一個正則表達式上。

但後來,我換了2號之一:

url(r'^$', 'course.views.index'), 

這沒有問題我想它的工作方式!

我知道「$」意味着行尾,但不應該第一個正則表達式先評估過了嗎?這些表達式的匹配順序是什麼?

爲每個網址添加「$」並不是什麼大不了的事,但我想明白爲什麼我把它放在那裏。

我使用Django1.4和Python 2.7

回答

3

閱讀Django的document

當用戶從您的 Django的網站請求一個頁面的Django如何處理請求

,這是系統根據 確定要執行的Python代碼的算法:

  1. Django確定要使用的根URLconf模塊。通常,這是ROOT_URLCONF設置的值,但如果傳入的HttpRequest對象具有名爲urlconf的屬性(由中間件 請求處理設置),則其值將用於替代ROOT_URLCONF設置的 設置。
  2. Django加載Python模塊並查找變量urlpatterns。這應該是一個Python列表,格式爲 ,函數django.conf.urls.patterns()返回。
  3. Django按順序遍歷每個URL模式,並停在與請求的URL匹配的第一個URL模式。
  4. 一旦一個正則表達式匹配,Django就會導入並調用給定的視圖,這是一個簡單的Python函數。該視圖通過一個 HttpRequest作爲其第一個參數,以及在正則表達式 中捕獲的任何值作爲其餘參數。
  5. 如果沒有正則表達式匹配,或者在此過程中的任何點發生異常,Django會調用相應的錯誤處理視圖。 請參閱下面的錯誤處理。

它說3. Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL.所以我認爲這是一個錯誤。

你應該在每一個URL模式添加$除非Including other URLconfs

+1

爲每個網址添加一個「$」並不是什麼大事,但我想明白爲什麼我把它放在那裏:) – Samudra

1

你是對的,django doc講述:

的Django如何處理請求

當用戶從你請求一個頁面Django支持的站點,這是系統遵循的算法來確定要執行的Python代碼:

  1. Django確定要使用的根URLconf模塊。通常,這是ROOT_URLCONF設置的值,但如果傳入的HttpRequest對象具有名爲urlconf的屬性(由中間件請求處理設置),則將使用其值替代ROOT_URLCONF設置。
  2. Django加載Python模塊並查找變量urlpatterns。這應該是一個Python列表,格式爲函數django.conf.urls.patterns()返回的格式。
  3. Django按順序遍歷每個URL模式,並停在與請求的URL匹配的第一個URL模式。
  4. 一旦一個正則表達式匹配,Django就會導入並調用給定的視圖,這是一個簡單的Python函數。該視圖通過一個 HttpRequest作爲其第一個參數,以及在正則表達式 中捕獲的任何值作爲其餘參數。
  5. 如果沒有正則表達式匹配,或者在此過程的任何點發生異常,Django會調用相應的錯誤處理 視圖。見下面的錯誤處理。

這也是什麼another SO post建議來解決另一個URL的評價問題。

+2

我已經經歷了這個,但這並不能解釋爲什麼第二個正則表達式url(r'^'...)匹配,而不是第一個(url(r'^ P ...)在我原來的urls.py中。 事實上,據我瞭解這個文檔的意思,第一個是應該匹配的,對嗎?我誤解了一些東西嗎? – Samudra

+1

是的,我不清楚^^再次閱讀文檔後,沒有提到打開URL模式(沒有'$')也將評估打開!所以對我來說這是一個錯誤。 – Emmanuel

相關問題