python的web伺服器:django如何優雅的應對善變的URL

前一篇文章已經講到,新加一個網址,需要在urls.py中添加正則表達式和對應的函數。當網站越來越大時,網站內部的跳轉會增多,隨著項目的進行,某些網址需要發生變化,而跳轉到這些網址的鏈接可能都需要修改。如何解決這一個問題呢?

在firstproject的基礎上添加一個網址,用於做加法運算。

1.在firstapp/views.py中添加一個add函數

defadd(request):

a =request.GET['a']

b =request.GET['b']

c =int(a)+int(b)

returnHttpResponse(str(c))

2.在firstproject/urls.py中的urlpatterns中添加如下一行

Advertisements

url(r'^add/$',firstapp.add,name='add')

3.輸入網址訪問

訪問如下頁面,你會得到計算結果9

http://www.ddxxhome.cn:8124/add/?a=4&b=5

url優化

上述的網址顯得冗餘。

由於我們需要精簡url,那麼顯然4和5是必不可少的,a和b是可以去掉的。我們希望網址簡化成這樣:

http://www.ddxxhome.cn:8124/add/4/5

由於a和b變數已經不存在了,從request中也取不到a和b了,只有數字4和5,因此要重新定義add2函數,如下所示

def add2(request,a,b):

c=int(a) +int(b)

return HttpResponse(str(c))

Advertisements

然後再urls.py中增加一行

url(r'^add/(\d+)/(\d+)/$',firstviews.add2,name='add2'),

說明一下,\d表示數字,+表示多個字元組成的數字,括弧的意思是保存為一個子組。每個子組將作為一個參數被add2函數接收。

現在訪問如下網址,順利得到加法結果13.

http://www.ddxxhome.cn:8124/add/6/7/

name詳解

每次添加urlpatterns時,最後面的那個參數name有啥用呢?簡單的說,name可以用於在templates,models和views中得到對應的網址。

1.修改views.py中的index函數的實現

def index(request):

return render(request,'home.html')

這裡render是渲染模板。

由於firstapp已經添加到INSTALLED_APPS列表中去了,render函數自動找到firstapp下的templates中的文件,例如home.html

2.創建home.html文件

現在firstapp目錄下創建一個templates目錄

然後在templates目錄中創建home.html文件,內容如下:

3.在urls.py中,給index那個url也添加個name='home'

此時我們訪問http://www.ddxxhome.cn:8124/時,頁面只有一個鏈接"計算4+5",點擊這個鏈接,就可以跳轉到 http://www.ddxxhome.cn:8124/add/4/5這個頁面。

4.需求變化

此時做加法用的是/add/4/5這種網址,如果需求變化了,我們要改成/4_add_5/這種網址,但在home.html中我們寫死了/add/4/5這種方式,如果用到該網址的地方很多,那麼修改起來很麻煩。

有了name就好辦了,在home.index中,我們把那個鏈接改成

<ahref="{% url 'add2' 4 5 %}">link</a> #這就是最終用到那個name的地方。

這樣django就會自己去找add2這個name對應的正則表達式格式,並把4,5作為入參傳進去得到最終的網址。這是通過django.core.urlresolvers.reverse(1.4 later) 或者django.urls.reverse(2.0)來實現的。

舉個例子,假如add2的正則表達式改成new_add,如下所示

url(r'^new_add/(\d+)/(\d+)/$', firstviews.add2, name='add2'),

home.html中不需要做任何修改,我們立刻可以通過index網頁點擊鏈接,自動跳轉到新的new_add網頁。

Advertisements

你可能會喜歡