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網頁。