iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 13
1
Modern Web

From Django 1.11 to Django 2.1 系列 第 13

Day13 : path & re_path vs. url

今天我們來談談在 Django2.X 及 Django1.11 中 一個較大的轉變,那就是網址配對的寫法,白話來講,就是在 urls.py 中,今天當使用者進入不同的網站時,它是怎麼去做查詢(lookup)的,今天的主題共分為這三類

  1. path
  2. re_path
  3. url

廢話不多說,就讓我們開始吧!

我們在 Day4,就有介紹 urls.py 的用途,就是擔任橋梁的腳色

用下面這兩張圖來做說明
ithome/urls.py ↓
https://ithelp.ithome.com.tw/upload/images/20181013/201118294F8eL8LUKf.jpg

welcome/urls.py ↓
https://ithelp.ithome.com.tw/upload/images/20181013/20111829ACptcc7hp9.jpg

當我們今天欲查詢 /welcome/,那麼它會去撈 views.index 的資料,並將內容顯示在使用者的螢幕上

而在 Django 2 以前, 網址的寫法都是用 url() 搭配 正規表示法(regular expression),範例如下

# 今天的介紹我都會使用官網的範例來做說明
from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]

想法相當直觀,今天欲查詢的頁面,會一個一個做配對,直到找到與自己配對的網址,在根據後方的views來做相對的回應

當然也會有找不到頁面的狀況,相信大家都很熟悉,若是今天欲搜尋的網址找不到,那就是 404 not found,網站會貼心提醒你此網頁不存在

像是Chrome預設的介面
https://ithelp.ithome.com.tw/upload/images/20181013/20111829EzYeE0zCBY.jpg

而在 Django 2,url已經正式被打入冷宮了(幫QQ),而是由另外兩個人來代替,分別是

  • path
  • re_path

而url在未來不久,就要被驅逐出境了

This function is an alias to django.urls.re_path(). It’s likely to be deprecated in a future release.

從上述那句話可以得知, url 的精神還在,只是被小三 re_path取代了,而你出自於好奇心去追source code

from django.urls import include, re_path
from django.views import defaults

__all__ = ['handler400', 'handler403', 'handler404', 'handler500', 'include', 'url']

...略

def url(regex, view, kwargs=None, name=None):
    return re_path(regex, view, kwargs, name)

如果你學到的方法是使用url,在Django 2中你當然可以繼續使用,但既然它也是呼叫re_path來幫它完成事情,那也就沒有繼續使用url的必要拉 ^^"

接著,來到了今天的重頭戲 path,它是在Django 2 一個全新的函式,有了它,在寫url時可以省下你不少的功夫,舉例來說

#原本的寫法
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),

#修改後的寫法
path('articles/<int:year>/', views.year_archiv),
path('articles/<int:year>/<int:month>', views.montu_archiv)

<int:year><int:month> 前面所代表的就是資料型態,後方代表的是資料變數,而這些變數就是要傳給views做處理的!

也就是說,網址是
articles/XXXX 及 articles/XXXX/XX (XX裡填的 都要是 整數)

分別就會對應到

year_archive 及 month_archive

也就是說,我們在相同目錄下的views裡所定義的函式,會多帶這些參數

# 示意圖
# 這裡多傳入 year
def year_archive(request, year):
    ...

# 這裡多傳入 year 及 month
def month_archive(request, year, month):
    ...
    

如此一來,我們便能透過更簡潔的方式寫 url ^^

想當然爾,能夠傳入的參數型態當然不只有<int>囉! 還有這一些型態可以使用

  • str : 怎麼能缺少字串呢! 你說對吧! 而且當你沒有設定型態的話,它預設就是用 str 唷!
  • slug : 類似於 str,但不一樣的地方在於,slug還多包含了ASCII符號,例 : coding-is-so-fun
  • uuid : 用來辨識用的資訊,為了就是避免發生碰撞囉 ^^

uuid的原文上也有提到 :
the annual risk of someone being hit by a meteorite is estimated to be one chance in 17 billion

發生機率是170億的機會,所以不用太擔心拉!

今天主要帶大家了解 Django 2 在 url 上的轉變,若你剛開始學 Django 2,從今天開始使用path及re_path吧!

唯有不斷的主動學習,才知道自己哪裡不足 From BY


上一篇
Day12 : Models & Admin (3)
下一篇
Day14 : Template 的運作
系列文
From Django 1.11 to Django 2.1 30

1 則留言

0
阿尼
iT邦新手 5 級 ‧ 2018-10-13 23:24:10

好像需要再說清楚一點呢~
我的理解如下

re_path 用在有regex的時候,
path 則是在沒有特別需要規範資料內容的一個方便用法。

Percy iT邦新手 5 級 ‧ 2018-10-14 17:20:07 檢舉

你的理解沒有錯~

我的認知是 path 能在管理上更直觀且方便

但 re_path 使用regex,所以 url 的寫法靈活度比較高

至於要怎麼使用就要取決於最初設計網頁的架構了

感謝你的回覆

我要留言

立即登入留言