Django blog - Django url 介紹

歡迎訪問個人博客

Abstract

Django 遵從 MVC 模型,并將其特色化為 MTV 模型距淫。T是模板template娱颊,V是視圖view。模型的核心是通過用戶訪問的 url 來指向處理的view函數(shù)耽装,而view函數(shù)處理后返回相應(yīng)的結(jié)果。
url是所有功能的入口期揪,所以url的編寫就變得非常重要掉奄。
另外Django的URL支持re正則表達式,可以提供豐富的URL解析地址


關(guān)于請求

這里簡單說明下Django的請求原理

  • 用戶發(fā)起request請求到Django服務(wù)

  • Django 服務(wù)通常會根據(jù)settings.py里面的配置ROOT_URLCONF來進行模塊匹配凤薛。默認(rèn)ROOT_URLCONF = 'myproject.urls'

  • Django 加載該 Python 模塊并尋找可用的 urlpatterns 變量姓建。該變量是一個 Python 列表,詳見myproject/myproject/urls.py缤苫。

  • Django 按照順序的方式速兔,正則匹配每一個URL模式,在第一個與請求的URL 匹配的地方停下來(下面也符合的會被忽視)活玲。

  • 一旦匹配到涣狗,Django 將導(dǎo)入并調(diào)用給出的視圖中涉及到的函數(shù)谍婉。

    視圖將獲得如下參數(shù):

    • 一個HttpRequest 實例(這也是為什么 view 函數(shù)的第一個參數(shù)要是 request,該實例封裝了所有的 http 請求報文的信息)

    • 如果正則匹配的 url 中使用了括號分組镀钓,但卻沒有為分組進行命名穗熬,則使用位置參數(shù)的模式為view函數(shù)傳參。強烈建議使用關(guān)鍵字命名的分組

    • 如果是命名的分組丁溅,則使用關(guān)鍵字傳參的方式唤蔗。但是可以被django.conf.urls.url()的可選參數(shù)kwargs覆蓋。

    • 如果沒有匹配到正則表達式窟赏,或者如果過程中拋出一個異常妓柜,Django 將調(diào)用一個適當(dāng)?shù)腻e誤處理視圖。

    • 函數(shù)處理完畢饰序,返回處理后的結(jié)果领虹。


urlpatterns

前面講到Django會加載Python模塊最終尋找 urlpatterns 變量的配置规哪,這里該變量有自己固有的配置方式求豫。

參考官網(wǎng)例子:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    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),
    url(r'^admin/', admin.site.urls),  ## 特殊URL
    url('r'^blog/', include('blog.urls', namespace='blog')) ## 包含APP URL
]
  • 每一行url()記錄都是一類URL匹配模式
  • 每個正則表達式前面的r 是可選的但是建議加上。
    它是原始的诉稍,字符串中任何字符都不應(yīng)該轉(zhuǎn)義蝠嘉。
  • 不需要添加一個前導(dǎo)的反斜杠,因為django自動在域名后添加了/杯巨。
    比如這里: 應(yīng)該是^articles 而不是^/articles
  • 如上面的最后兩個配置蚤告,admin和新增的APP blog的配置。/ 后面不需要添加$
  • 若要從 URL 中捕獲一個值服爷,只需要在它周圍放置一對圓括號杜恰。也就是上面提到的命名分組(即正則中的分組匹配)

命名分組

我們強烈建議使用關(guān)鍵字命名分組

舉例如下:

(?P<articleid>\d+) 這個分組表示匹配一個或多個(+ Python正則中代表一個或者多個)任意的數(shù)字(\d 代表匹配數(shù)字),并以 articleid = 匹配到的數(shù)字仍源,如 articleid = '123' 的方式傳給view匹配到的函數(shù)心褐。

注意:

url 捕獲的所有參數(shù)都是字符串類型,雖然 \d 在正則中表示匹配數(shù)字笼踩,但傳參的時候逗爹,傳的都是字符串


匹配/分組算法

下面是URLconf 解析器使用的算法嚎于,針對正則表達式中的命名組和非命名組:

1掘而、如果有命名參數(shù),則使用這些命名參數(shù)于购,忽略非命名參數(shù)袍睡。
2、否則肋僧,它將以位置參數(shù)傳遞所有的非命名參數(shù)斑胜。
3持舆、命名分組不允許同名

對于上面的第一條,舉例驗證如下:

## urls.py
url(r'add/(\d+)/(?P<num1>\d+)/(?P<num2>\d+)/', add, name='add'),

## views.py
def add(request, num1, num2):
    num1 = int(num1)
    num2 = int(num2)
    return HttpResponse(num1 + num2)

在實際中看到這里有三個參數(shù)伪窖,比如我們有地址 /add/789/456/123逸寓,匹配到了上面的這條URL記錄,然后對應(yīng)的解析到view函數(shù)add覆山。

實際返回的結(jié)果是 456+123=679 而不是 789+456+123=1368
請自行實踐操作驗證哦


url() 中的name

name 可以用于在 templates, models, views ……中得到對應(yīng)的網(wǎng)址竹伸,相當(dāng)于給網(wǎng)址取了個名字,只要這個名字不變簇宽,網(wǎng)址變了也能通過名字獲取到勋篓。

舉例說明:
我們有如下URL請求

url(r'add/(\d+)/(?P<num1>\d+)/(?P<num2>\d+)/', views.add, name='add'),

在模板中存在一個add.html的頁面

<a href="{% url 'add' 4 5 %}">計算求和</a>
# 這里的HTML的地址最終會被解析成
<a href="/add/4/5">計算求和</a>

如果我們的URL地址發(fā)生變化,變成:

url(r'new_add/(\d+)/(?P<num1>\d+)/(?P<num2>\d+)/', views.add, name='add'),

只要我們上面的name='add' 不發(fā)生變化魏割,HTML頁面的中<a href="{% url 'add' 4 5 %}">計算求和</a> 將會自動解析成<a href="/new_add/4/5">計算求和</a>

這里也就要求我們在HTML模板頁面中不要用寫死的方式寫URL地址哦譬嚣,而要用 {% url 'xxx' %}的方式


參考:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
http://code.ziqiangxuetang.com/django/django-url-name.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钞它,隨后出現(xiàn)的幾起案子拜银,更是在濱河造成了極大的恐慌,老刑警劉巖遭垛,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尼桶,死亡現(xiàn)場離奇詭異,居然都是意外死亡锯仪,警方通過查閱死者的電腦和手機泵督,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庶喜,“玉大人小腊,你說我怎么就攤上這事【每撸” “怎么了秩冈?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘸羡。 經(jīng)常有香客問我漩仙,道長,這世上最難降的妖魔是什么犹赖? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任队他,我火速辦了婚禮,結(jié)果婚禮上峻村,老公的妹妹穿的比我還像新娘麸折。我一直安慰自己,他們只是感情好粘昨,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布垢啼。 她就那樣靜靜地躺著窜锯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芭析。 梳的紋絲不亂的頭發(fā)上锚扎,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音馁启,去河邊找鬼驾孔。 笑死,一個胖子當(dāng)著我的面吹牛惯疙,可吹牛的內(nèi)容都是我干的翠勉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼霉颠,長吁一口氣:“原來是場噩夢啊……” “哼对碌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒿偎,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤朽们,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酥郭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體华坦,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡愿吹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年不从,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犁跪。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡椿息,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坷衍,到底是詐尸還是另有隱情寝优,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布枫耳,位于F島的核電站乏矾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏迁杨。R本人自食惡果不足惜钻心,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铅协。 院中可真熱鬧捷沸,春花似錦、人聲如沸狐史。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苍柏,卻和暖如春尼斧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背试吁。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工突颊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潘悼。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓律秃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親治唤。 傳聞我的和親對象是個殘疾皇子棒动,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容