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