這篇文章主要介紹了Python的Django框架中從url中捕捉文本的方法,以及URLconf搜索的一些相關情況,需要的朋友可以參考下
每個被捕獲的參數將被作為純Python字符串來發送,而不管正則表達式中的格式。 舉個例子,在這行URLConf中:
- (r'^articles/(?P<year>/d{4})/$', views.year_archive),
盡管 /d{4} 將只匹配整數的字符串,但是參數 year 是作為字符串傳至 views.year_archive() 的,而不是整型。
當你在寫視圖代碼時記住這點很重要,許多Python內建的方法對于接受的對象的類型很講究。 許多內置Python函數是挑剔的(這是理所當然的)只接受特定類型的對象。 一個典型的的錯誤就是用字符串值而不是整數值來創建 datetime.date 對象:
- >>> import datetime
- >>> datetime.date('1993', '7', '9')
- Traceback (most recent call last):
- ...
- TypeError: an integer is required
- >>> datetime.date(1993, 7, 9)
- datetime.date(1993, 7, 9)
回到URLconf和視圖處,錯誤看起來很可能是這樣:
- # urls.py
-
- from django.conf.urls.defaults import *
- from mysite import views
-
- urlpatterns = patterns('',
- (r'^articles/(/d{4})/(/d{2})/(/d{2})/$', views.day_archive),
- )
-
- # views.py
-
- import datetime
-
- def day_archive(request, year, month, day):
- # The following statement raises a TypeError!
- date = datetime.date(year, month, day)
因此, day_archive() 應該這樣寫才是正確的:
- def day_archive(request, year, month, day):
- date = datetime.date(int(year), int(month), int(day))
注意,當你傳遞了一個并不完全包含數字的字符串時, int() 會拋出 ValueError 的異常,不過我們已經避免了這個錯誤,因為在URLconf的正則表達式中已經確保只有包含數字的字符串才會傳到這個視圖函數中。
決定URLconf搜索的東西
當一個請求進來時,Django試著將請求的URL作為一個普通Python字符串進行URLconf模式匹配(而不是作為一個Unicode字符串)。 這并不包括 GET 或 POST 參數或域名。 它也不包括第一個斜杠,因為每個URL必定有一個斜杠。
例如,在向 http://www.example.com/myapp/ 的請求中,Django將試著去匹配 myapp/ 。在向 http://www.example.com/myapp/?page=3 的請求中,Django同樣會去匹配 myapp/ 。
在解析URLconf時,請求方法(例如, POST , GET , HEAD )并 不會 被考慮。 換而言之,對于相同的URL的所有請求方法將被導向到相同的函數中。 因此根據請求方法來處理分支是視圖函數的責任。