Django中的 動態URL配置

2021-09-07 09:11:48 字數 4239 閱讀 1510

讓我們建立第三個檢視來顯示當前時間和加上時間偏差量的時間,設計是這樣的:

新手可能會考慮寫不同的檢視函式來處理每個時間偏差量,url配置看起來就象這樣:

urlpatterns = patterns(''

, (

'^time/$

', current_datetime),

('^time/plus/1/$

', one_hour_ahead),

('^time/plus/2/$

', two_hours_ahead),

('^time/plus/3/$

', three_hours_ahead),

('^time/plus/4/$

', four_hours_ahead),

)

很明顯,這樣處理是不太妥當的。 不但有很多冗餘的檢視函式,而且整個應用也被限制了只支援 預先定義好的時間段,2小時,3小時,或者4小時。 如果哪天我們要實現 5 小時,我們就 不得不再單獨建立新的檢視函式和配置url,既重複又混亂。 我們需要在這裡做一點抽象,提取 一些共同的東西出來。

關於漂亮url的一點建議

你可以 在django裡也這樣做 (如果你真的想要這樣做,我們稍後會告訴你怎麼做), 但是django的乙個核心理念就是url必須看起來漂亮。 url /time/plus/3/ 更加清晰, 更簡單,也更有可讀性,可以很容易的大聲念出來,因為它是純文字,沒有查詢字串那麼 複雜。 漂亮的url就像是高質量的web應用的乙個標誌。

django的url配置系統可以使你很容易的設定漂亮的url,而盡量不要考慮它的反面 。

那麼,我們如何設計程式來處理任意數量的時差? 答案是:使用萬用字元(wildcard urlpatterns)。正如我們之前提到過,乙個url模式就是乙個正規表示式。因此,這裡可以使用d+來匹配1個以上的數字。

urlpatterns = patterns(''

,

#...

(r'^time/plus/\d+/$

', hours_ahead),

#...

)

這裡使用# …來表示省略了其它可能存在的url模式定義。 (見上)

這個url模式將匹配類似 /time/plus/2/ , /time/plus/25/ ,甚至 /time/plus/100000000000/ 的任何url。 更進一步,讓我們把它限制在最大允許99個小時, 這樣我們就只允許乙個或兩個數字,正規表示式的語法就是 \d :

(r'

^time/plus/\d/$

', hours_ahead),

在建造web應用的時候,盡可能多考慮可能的資料輸入是很重要的,然後決定哪些我們可以接受。 在這裡我們就設定了99個小時的時間段限制。

另外乙個重點,正規表示式字串的開頭字母「r」。 它告訴python這是個原始字串,不需要處理裡面的反斜槓**義字元)。 在普通python字串中,反斜槓用於特殊字元的轉義。比如n轉義成乙個換行符。 當你用r把它標示為乙個原始字串後,python不再視其中的反斜槓為轉義字元。也就是說,「n」是兩個字串:「」和「n」。由於反斜槓在python**和正規表示式中有衝突,因此建議你在python定義正規表示式時都使用原始字串。 從現在開始,本文所有url模式都用原始字串。10

現在我們已經設計了乙個帶萬用字元的url,我們需要乙個方法把它傳遞到檢視函式裡去,這樣 我們只用乙個檢視函式就可以處理所有的時間段了。 我們使用圓括號把引數在url模式裡標識 出來。 在這個例子中,我們想要把這些數字作為引數,用圓括號把 \d 包圍起來:

(r'

^time/plus/(\d)/$

', hours_ahead),

如果你熟悉正規表示式,那麼你應該已經了解,正規表示式也是用圓括號來從文字裡 提取 資料的。2

最終的urlconf包含上面兩個檢視,如:

讓我們逐行分析一下**:

檢視函式, hours_ahead , 有 兩個 引數: request 和 offset . (見上)

request 是乙個 httprequest 物件, 就像在 current_datetime 中一樣. 再說一次好了: 每乙個檢視 總是 以乙個 httprequest 物件作為 它的第乙個引數。 (見上)

offset 是從匹配的url裡提取出來的。 例如:如果請求url是/time/plus/3/,那麼offset將會是3;如果請求url是/time/plus/21/,那麼offset將會是21。請注意:捕獲值永遠都是字串(string)型別,而不會是整數(integer)型別,即使這個字串全由數字構成(如:「21」)。

(從技術上來說,捕獲值總是unicode objects,而不是簡單的python位元組串,但目前不需要擔心這些差別。)

在這裡我們命名變數為 offset ,你也可以任意命名它,只要符合python 的語法。 變數名是無關緊要的,重要的是它的位置,它是這個函式的第二個 引數 (在 request 的後面)。 你還可以使用關鍵字來定義它,而不是用 位置。

我們在這個函式中要做的第一件事情就是在 offset 上呼叫 int() . 這會把這個字串值轉換為整數。

請留意:如果你在乙個不能轉換成整數型別的值上呼叫int(),python將丟擲乙個valueerror異常。如:int(『foo』)。在這個例子中,如果我們遇到valueerror異常,我們將轉為丟擲django.http.http404異常——正如你想象的那樣:最終顯示404頁面(提示資訊:頁面不存在)。

機靈的讀者可能會問: 我們在url模式中用正規表示式(d)約束它,僅接受數字怎麼樣?這樣無論如何,offset都是由數字構成的。 答案是:我們不會這麼做,因為urlpattern提供的是「適度但有用」級別的輸入校驗。萬一這個檢視函式被其它方式呼叫,我們仍需自行檢查valueerror。 實踐證明,在實現檢視函式時,不臆測引數值的做法是比較好的。 鬆散耦合,還記得麼?

下一行,計算當前日期/時間,然後加上適當的小時數。 在current_datetime檢視中,我們已經見過datetime.datetime.now()。這裡新的概念是執行日期/時間的算術操作。我們需要建立乙個datetime.timedelta物件和增加乙個datetime.datetime物件。 結果儲存在變數dt中。

這一行還說明了,我們為什麼在offset上呼叫int()——datetime.timedelta函式要求hours引數必須為整數型別。

這行和前面的那行的的乙個微小差別就是,它使用帶有兩個值的python的格式化字串功能, 而不僅僅是乙個值。 因此,在字串中有兩個 %s 符號和乙個以進行插入的值的元組: (offset, dt) 。

最終,返回乙個html的httpresponse。 如今,這種方式已經過時了。28

在完成檢視函式和url配置編寫後,啟動django開發伺服器,用瀏覽器訪問 來確認它工作正常。 然後是 。再然後是 。最後,訪問 來檢驗url配置裡設定的模式是否只 接受乙個或兩個數字;django會顯示乙個 page not found error 頁面, 和以前看到的 404 錯誤一樣。 訪問url (沒有 定義時間差) 也會丟擲404錯誤。

Django的高階url配置

關於django的url配置,有特別多的方法和方式,最簡單的理解就是 from django.conf.urls.defaults import from mysite.views import hello,current datetime,hours ahead urlpatterns patte...

django安裝及url配置

建立專案 django admin startproject qingqing cd qingqing 啟動專案 python manage.py runserver 127.0.0.1 8001 cd qingqing django.contrib.admin django.contrib.aut...

Django框架中配置url路由時name的作用

當後期要修改url設定規則時,在不使用name欄位的時候,不但要修改urls.py檔案中的url路由,還要講html檔案中所有的相同路徑進行修改,在實際應用中將會有大量的url路由,這樣修改下來將會十分的麻煩。但是,如果使用name欄位只需要在urls.py 檔案中將path 中的url路由修改了就...