<source id="4vppl"><ins id="4vppl"></ins></source>
<u id="4vppl"><sub id="4vppl"><label id="4vppl"></label></sub></u>
<object id="4vppl"></object>
  • <u id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></u>

    <object id="4vppl"></object>
    <b id="4vppl"><sub id="4vppl"><tr id="4vppl"></tr></sub></b>

      <i id="4vppl"><thead id="4vppl"></thead></i>

      <thead id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></thead>

      當(dāng)前位置:首頁 > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > 翻譯www.djangobook.com之第三章:動(dòng)態(tài)Web頁面基礎(chǔ)

      翻譯www.djangobook.com之第三章:動(dòng)態(tài)Web頁面基礎(chǔ)
      2010-01-13 23:33:26  作者:  來源:
      上一章我們解釋了怎樣開始一個(gè)Django項(xiàng)目和運(yùn)行Django服務(wù)器
      當(dāng)然了,這個(gè)站點(diǎn)實(shí)際上什么也沒有做------除了顯示了"It worked"這條信息以外。
      這一章我們介紹怎樣使用Django創(chuàng)建動(dòng)態(tài)網(wǎng)頁

      你的第一個(gè)視圖:動(dòng)態(tài)內(nèi)容
      讓我們創(chuàng)建一個(gè)顯示當(dāng)前日期和時(shí)間的Web頁面來作為你的第一個(gè)目標(biāo)
      這是一個(gè)動(dòng)態(tài)Web頁面的例子,因?yàn)轫撁鎯?nèi)容根據(jù)計(jì)算當(dāng)前時(shí)間而變化
      這個(gè)例子不需要數(shù)據(jù)庫和任何用戶輸入,只是輸出服務(wù)器內(nèi)部時(shí)鐘
      我們將寫一個(gè)視圖方法,它只是一個(gè)Python方法,接受Web請求并返回Web應(yīng)答
      這個(gè)應(yīng)答可以是HTML內(nèi)容、重定向、404錯(cuò)誤、XML文檔、圖像等等
      視圖本身包含任意必要的邏輯來返回應(yīng)答
      在這里視圖作為HTML文檔返回當(dāng)前日期和時(shí)間
      Java代碼 復(fù)制代碼
      1. from django.http import HttpResponse   
      2. import datetime   
      3. def current_datetime(request):   
      4.  now = datetime.datetime.now()   
      5.  html = "It is now %s." % now   
      6.  return HttpResponse(html)  

      讓我們來看看代碼
      1,首先,我們從django.http模塊import HttpResponse類
      2,然后,我們從Python標(biāo)準(zhǔn)庫import datetime模塊
      datetime模塊包含一些處理日期和時(shí)間的類和方法,并且包含一個(gè)返回當(dāng)前時(shí)間的方法
      3,然后,我們定義current_datetime方法
      這是一個(gè)視圖方法,它使用一個(gè)HttpRequest對(duì)象作為它的第一個(gè)參數(shù)
      每個(gè)視圖方法都使用HttpRequest對(duì)象作為自己的第一個(gè)參數(shù)
      在這個(gè)方法里,我們把這個(gè)參數(shù)叫做request
      Django并不關(guān)心視圖方法的名字,我們也不必遵循某種特定的命名方式供Django鑒別。我們以current_datetime命名這個(gè)方法
      純粹是因?yàn)樗每梢悦鞔_的表達(dá)方法的意圖,你可以任意地命名view方法,current_datetime清楚的表明了它會(huì)做什么事情
      一會(huì)我們會(huì)解釋Django怎樣找到這個(gè)方法
      4,該方法的第一行代碼計(jì)算當(dāng)前日期和時(shí)間,并存儲(chǔ)在本地變量now中
      5,該方法的第二行代碼使用Python的格式化string能力構(gòu)建了一個(gè)HTML應(yīng)答
      string里面的%s是一個(gè)占位符,string后面的百分號(hào)表示使用now變量的值代替%s
      (給html純化論者們:我們沒有寫DOCTYPE申明,沒有<head>標(biāo)簽,等等等等,我們只是盡量讓這個(gè)頁面簡潔明了。)
      6,最后,視圖返回一個(gè)包含生成的HTML的HttpResponse對(duì)象
      每個(gè)視圖方法都會(huì)返回一個(gè)HttpResponse對(duì)象,例外的情況我們后面會(huì)解釋

      你的第一個(gè)URL配置
      這個(gè)視圖方法返回了一個(gè)包含當(dāng)前日期和時(shí)間的HTML頁面
      但是這些代碼應(yīng)該放在哪?怎樣告訴Django使用這些代碼呢?
      第一個(gè)問題的答案是:你可以把view的代碼放在任何位置,只要它是在你的Python PATH下,沒有任何其他的要求----沒有"魔術(shù)"。
      我們將這些代碼保存在views.py里面,并將views.py放在mysite目錄下
      Python PATH是一個(gè)你系統(tǒng)的目錄列表,當(dāng)你使用Python import語句時(shí)Python會(huì)查看這些目錄
      例如你的Python PATH設(shè)置成['', '/usr/lib/python2.4/site-packages', '/home/mycode']
      如果你執(zhí)行代碼from foo import bar,Python將首先在當(dāng)前目錄下查找叫foo.py的模塊
      第一個(gè)Python PATH為空string,這表示當(dāng)前目錄
      如果找不到foo.py,Python將嘗試查找/usr/lib/python2.4/site-packages/foo.py
      最后,如果foo.py還是找不到,Python將報(bào)ImportError
      如果你有興趣查看Python PATH,進(jìn)入Python交互環(huán)境并輸入import sys和print sys.path
      一般來說你不必?fù)?dān)心設(shè)置Python PATH,Python和Django會(huì)暗中自動(dòng)為你做這些事情
      如果你實(shí)在好奇,設(shè)置Python PATH是manage.py的一個(gè)工作
      我們怎么告訴Django使用這些視圖代碼?答案是URL配置
      URLConf就像是一張Django web站點(diǎn)的內(nèi)容表格。基本上,這個(gè)配置是一個(gè)URL模式和對(duì)應(yīng)的view函數(shù)的映射,這些函數(shù)會(huì)在請求某個(gè)符合特定模式的URL時(shí)被調(diào)用。
      URLconf就是告訴Django,"對(duì)于這個(gè)URL,調(diào)用這些代碼,對(duì)于那個(gè)URL,調(diào)用那些代碼..."
      URL配置就像是你的Django項(xiàng)目的目錄
      基本上,它是URL模式和URL模式調(diào)用的視圖方法的映射
      django-admin.py startproject會(huì)自動(dòng)生成一個(gè)URL配置文件urls.py,默認(rèn)情況下它是這樣的:
      Java代碼 復(fù)制代碼
      1. from django.conf.urls.defaults import *   
      2. urlpatterns = patterns('',   
      3.  # Example:   
      4.  # (r'^mysite/', include('mysite.apps.foo.urls.foo')),   
      5.   
      6.  # Uncomment this for admin:   
      7. # (r'^admin/', include('django.contrib.admin.urls')),   
      8. )  

      讓我們來看看這些代碼
      1,第一行import django.conf.urls.defaults模塊的所有對(duì)象,包括一個(gè)叫patterns的方法
      2,第二行調(diào)用patterns()方法并將接過保存到urlpatterns變量,patterns()方法只傳了一個(gè)空string作為參數(shù)
      其它行被注釋掉了
      這里主要看的就是變量urlpatterns,它定義了URL和處理URL的代碼的映射
      默認(rèn)情況下所有的URL配置被注釋掉了,這意味著你的Django項(xiàng)目是空的,這讓Django得知顯示“It worked!”頁面
      如果你的URL配置是空的,Django假設(shè)你剛開始一個(gè)新的項(xiàng)目,這樣就顯示這條信息
      讓我們編輯urls.py來暴露current_datetime視圖:
      Java代碼 復(fù)制代碼
      1. from django.conf.urls.defaults import *   
      2. form mysite.views import current_datetime   
      3.   
      4. urlpatterns = patterns('',   
      5.  (r'^now/$', current_datetime),   
      6. )  

      我們做了兩處改動(dòng)。首先,我們從mysite/views.py模塊import current_datetime視圖
      該模塊在Python的import語法中被轉(zhuǎn)換成mysite.views
      然后我們增加一行(r'^now/$', current_datetime),它指向一個(gè)URL模式
      這是一個(gè)Python元組,第一個(gè)元素是一個(gè)正則表達(dá)式,第一個(gè)是視圖方法
      這樣,我們就告知Django對(duì)URL /now/的請求應(yīng)該被current_datetime視圖方法處理
      注意幾個(gè)地方:
      1,在例子中,我們把視圖方法current_datetime當(dāng)成對(duì)象傳遞而不是調(diào)用這個(gè)方法
      這是Python及其它動(dòng)態(tài)語言的特性,函數(shù)是第一類對(duì)象,可以像其它變量一樣傳遞,cool吧?
      2,不必在'^now/$'前面增加斜線來匹配/now/,Django自動(dòng)在每個(gè)表達(dá)式前面添加斜線
      3,'^'和'$'符號(hào)很重要,前者表示“匹配string的開始的模式”,后者表示“匹配string結(jié)束的模式”
      這個(gè)例子很好的解釋了概念問題,如果我們使用模式'^now/',則/now/,/now/foo,/now/bar都將匹配
      如果我們使用模式'now/$'則/now/,/foo/bar/now/等也將匹配
      所以我們使用'^now/$',則不多不少只有/now/匹配
      現(xiàn)在測試一下我們對(duì)URLConf的修改。運(yùn)行python manage.py runserver來啟動(dòng)Django的開發(fā)服務(wù)器
      (如果讓它一直運(yùn)行也沒有問題,服務(wù)器會(huì)自動(dòng)探測Python代碼的修改,在必要的時(shí)候重新載入,所以沒有必要一修改就重起)
      瀏覽器訪問http://127.0.0.1:8000/now/測試一下
      萬歲!你已經(jīng)開發(fā)了你的第一個(gè)Django-powered Web頁面

      Django怎樣處理請求
      Django怎樣處理Web請求?讓我們來看看事實(shí)真相
      1,命令python manage.py runserver尋找settings.py,這個(gè)文件包含了這個(gè)Django實(shí)例的所有配置選項(xiàng)
      最重要的設(shè)置是ROOT_URLCONF,它告訴Django使用哪個(gè)Python模塊作為當(dāng)前站點(diǎn)的URL配置
      2,當(dāng)一個(gè)請求進(jìn)來如/now/,Django載入U(xiǎn)RL配置,然后按順序檢查每個(gè)URL模式直到找到一個(gè)匹配的URL請求模式
      然后Django調(diào)用那個(gè)模式匹配的方法,并傳遞一個(gè)HttpRequest對(duì)象作為第一個(gè)參數(shù)
      3,視圖方法負(fù)責(zé)返回一個(gè)HttpResponse對(duì)象
      這樣你就了解了Django-powerd頁面的基礎(chǔ),它很簡單,只需寫視圖方法和通過URL配置映射到URL

      URL配置和松耦合
      現(xiàn)在是指出URL配置和Django后面的哲學(xué)的良好時(shí)機(jī):松耦合原則
      松耦合是具有使得部分模塊可替換的價(jià)值的軟件開發(fā)方法
      如果兩個(gè)模塊是松耦合的,那么對(duì)一個(gè)模塊做改動(dòng)不會(huì)或很少對(duì)另一個(gè)有影響
      Django的URL配置是這個(gè)原則的很好的例子
      在Django Web程序中,URL定義和視圖方法是松耦合的,開發(fā)人員可以替換其中一個(gè)而不會(huì)對(duì)另一個(gè)產(chǎn)生影響
      對(duì)比之下,其他的web開發(fā)平臺(tái)耦合了URL和程序,例如在basic php中,應(yīng)用的URL取決于代碼在文件系統(tǒng)中的位置,
      在CherryPy框架中,URL和應(yīng)用中的方法名稱是相對(duì)應(yīng)的。這些方式看來非常方便,但是長遠(yuǎn)來看會(huì)造成難以管理的問題
      舉例來說,考慮我們剛剛的那個(gè)顯示當(dāng)前時(shí)間的函數(shù)。如果我們想改變這個(gè)應(yīng)用的URL,比如從/now/變成/currenttime/
      我們可以對(duì)URLconf做一個(gè)非常快捷的修改,不用擔(dān)心隱藏在這個(gè)URL之后的函數(shù)實(shí)現(xiàn)。類似的,如果我們想修改view函數(shù)
      修改它的邏輯,我們用不著影響URL就可以做到。
      更進(jìn)一步,如果我們想把這個(gè)當(dāng)前時(shí)間的方法暴露到多個(gè)URL上,我們也可以通過修改URLconf輕易完成,而無需影響view的代碼。

      404錯(cuò)誤
      在我們當(dāng)前的URLconf里面只有一個(gè)處理/now/的URL模式。如果我們請求一個(gè)不同的URL會(huì)發(fā)生什么呢?
      當(dāng)訪問一個(gè)沒有在URLconf里面定義過的URL時(shí),你將看到一個(gè)"Page not found"的信息,因?yàn)檫@個(gè)URL還沒有定義在URLconf里。
      這個(gè)頁面的用途其實(shí)不僅僅是顯示404錯(cuò)誤信息:它精確的告訴我們Django使用了哪一個(gè)URLconf,以及這個(gè)配置里的每一個(gè)URL匹配模式。
      通過這個(gè)頁面我們可以輕易的得知為什么請求的URL拋出了404錯(cuò)誤。
      當(dāng)然了,這些信息的初衷是為了方便web開發(fā)者。如果這是一個(gè)實(shí)際的internet站點(diǎn),我們不希望這些信息被泄露出去。
      出于這個(gè)原因,這個(gè)"Page not found"頁面只顯示在debug模式下。

      你的第二個(gè)視圖:動(dòng)態(tài)URL
      第一個(gè)視圖例子中,頁面內(nèi)容當(dāng)前日期和時(shí)間是動(dòng)態(tài)的,但是URL("/now/")是靜態(tài)的
      大多數(shù)動(dòng)態(tài)Web程序中,URL包含了影響輸出頁面的參數(shù)
      下面的例子中我們使用一個(gè)數(shù)字來顯示為了幾小時(shí)的日期和時(shí)間
      如/now/plus1hour/顯示未來1小時(shí)的時(shí)間,/now/plus3hour/顯示未來3小時(shí)的時(shí)間
      先修改URL配置:
      Java代碼 復(fù)制代碼
      1. urlpatterns = patterns('',   
      2.  (r'^now/$', current_datetime),   
      3.  (r'^now/plus1hour/$', one_hour_ahead),   
      4.  (r'^now/plus2hour/$', two_hours_ahead),   
      5.  (r'^now/plus3hour/$', three_hours_ahead),   
      6.  {r'^now/plus4hour/$', four_hours_ahead),   
      7. )  

      顯然這樣的模式有缺陷,不僅會(huì)產(chǎn)生大量的視圖方法,還將程序局限在預(yù)先定義的小時(shí)范圍內(nèi)
      如果我們想顯示5小時(shí)后的時(shí)間,我們還得再添加一行
      所以我們應(yīng)該在這里做出一點(diǎn)抽象

      關(guān)于良好的URL
      如果你使用過PHP或Java,你可能會(huì)說“讓我們使用一個(gè)查詢參數(shù)”,類似于像/now/plus?hours=3
      你也可以使用Django這樣做,但是Django的一個(gè)核心哲學(xué)是,URL應(yīng)該是優(yōu)雅的
      /now/plus3hours/更干凈、更簡單、更可讀、更朗朗上口
      良好的URL是Web程序質(zhì)量的一個(gè)顯示
      Django的URL配置系統(tǒng)提供容易配置的良好的URL定義

      URL模式通配符
      繼續(xù)我們的例子,讓我們在URL模式中添加一個(gè)通配符
      上面提到,URL模式是一個(gè)正則表達(dá)式,這里我們可以使用\d+來匹配1個(gè)或多個(gè)數(shù)字:
      Java代碼 復(fù)制代碼
      1. from django.conf.urls.defaults import *   
      2. from mysite.views import corruent_datetime, hours_ahead   
      3.   
      4. urlpatterns = patterns('',   
      5.  (r'^now/$', current_datetime),   
      6.  (r'^now/plus\d+hours/$', hours_ahead),   
      7. )  

      這個(gè)URL模式可以匹配任何URL,例如/now/plus2hours/,/now/plus25hours/,甚至/now/plus100000000000hours/
      讓我們限制最多99小時(shí),即我們只允許1個(gè)或2個(gè)數(shù)字,在正則表達(dá)式里就是\d{1,2}:
      (r'^now/plus\d{1,2}hours/$', hours_ahead),
      當(dāng)我們構(gòu)建web程序的時(shí)候,考慮可能出現(xiàn)的不合常理的輸入, 并且決定是否處理這些輸入是非常重要的。
      我們在這里限制時(shí)間的偏移量<=99小時(shí)。順便啰嗦一句,Outlandishness Curtailers是個(gè)超級(jí)棒的樂隊(duì)。
      正則表達(dá)式是一個(gè)在文本里面指定模式的簡潔方式
      Django的URL配置允許任意的正則表達(dá)式來提供強(qiáng)大的URL匹配能力,下面是一些常用的模式:
      Java代碼 復(fù)制代碼
      1. Symbol    Matches   
      2. .(dot)    任意字符   
      3. \d        任意數(shù)字   
      4. [A-Z]     從A到Z的任意字符(大寫)   
      5. [a-z]     從a到z的任意字符(小寫)   
      6. [A-Za-z]  從a到z的任意字符(大小寫不敏感)   
      7. [^/]+     任意字符直到一個(gè)前斜線(不包含斜線本身)   
      8. +         一個(gè)或多個(gè)前面的字符   
      9. ?         零個(gè)或多個(gè)前面的字符   
      10. {1,3}     1個(gè)到3個(gè)之間前面的字符(包括13)  

      更多的正則表達(dá)式信息請查看Appendix 9,正則表達(dá)式
      好了,我們已經(jīng)在URL里設(shè)計(jì)了一個(gè)通配符,但我們需要把信息傳遞給視圖方法
      這樣我們才能使用一個(gè)單獨(dú)的視圖方法來處理任意的小時(shí)參數(shù)
      我們把我們在URL模式里希望保存的數(shù)據(jù)用括號(hào)括起來,即把\d{1,2}括起來
      (r'^now/plus(\d{1,2})hours/$', hours_ahead),
      如果你熟悉正則表達(dá)式,你會(huì)覺得非常親切:我們正是在使用括號(hào)從匹配的文本中獲得我們想要的數(shù)據(jù)。
      最終的URL配置如下:
      Java代碼 復(fù)制代碼
      1. from django.conf.urls.defautls import *   
      2. form mysite.views import current_datetime, hours_ahead   
      3.   
      4. urlpatterns = patterns('',   
      5.  (r'^now/$', current_datetime),   
      6.  (r'^now/plus(\d{1,2})hours/$', hours_ahead),   
      7. )  

      下面我們定義hours_ahead方法:
      告誡:關(guān)于編碼的順序
      在這個(gè)例子里面,我們先定義了URL模式,然后才開始撰寫view代碼,但是在前一個(gè)例子里,編碼的順序正好相反。那么哪一種方式更好呢?
      當(dāng)然,每一個(gè)開發(fā)人員都有不一樣的習(xí)慣。
      如果你是一個(gè)大局觀很好的人,一次性就定義好所有的URL模式,然后再來實(shí)現(xiàn)view的代碼,這是非常不錯(cuò)的。
      這種方式能夠展現(xiàn)一個(gè)非常清晰的to-do list,因?yàn)樗鼜母旧隙x了將要實(shí)現(xiàn)的view函數(shù)所需的參數(shù)。
      如果你是一個(gè)有著自底向上的習(xí)慣的程序員,你也許更愿意寫一個(gè)view,然后把它和某一個(gè)URL模式綁定起來。這樣做也不錯(cuò)。
      兩種方式當(dāng)然都是正確的,使用哪一個(gè)取決于哪一種更加符合你思考的模式。
      Java代碼 復(fù)制代碼
      1. from django.http import HttpResponse   
      2. import datetime   
      3.   
      4. def hours_ahead(request, offset):   
      5.  offset = int(offset)   
      6.  dt = datetime.datetime.now() + datetime.timedelta(hours=offset)   
      7.  html = "In %s hour(s), it will be %s." % (offset, dt)   
      8.  return HttpResponse(html)  

      我們還是一次一行的解讀這些代碼:
      跟我們在current_datetime里所做的一樣,我們導(dǎo)入了django.http.HttpResponse和datetime模塊
      view函數(shù)hours_ahead接受兩個(gè)參數(shù):request和offset。
      request是一個(gè)HttpRequest對(duì)象,和在current_datetime中一樣。我們要重申一點(diǎn):每一個(gè)view函數(shù)的第一個(gè)參數(shù)總是HttpRequest對(duì)象。
      offset是一個(gè)string,它的值是通過URL模式里的那一對(duì)括號(hào)從請求的URL中得到的。比如請求的URL是/now/plus3hours/
      offset的值就是一個(gè)string‘3’。請注意從URL中得到的值始終是string而不是integer,即使這個(gè)string是由純數(shù)字構(gòu)成的。
      我們把這個(gè)變量命名為offset,但是你可以用任何合法的Python變量名來命名它。變量的名字并不重要,但是必須是view函數(shù)的第二個(gè)參數(shù)。
      在函數(shù)里我們做的第一件事就是調(diào)用int(),把offset轉(zhuǎn)換成整形。
      如果一個(gè)值不能被轉(zhuǎn)換成為一個(gè)整型數(shù)(像字符串'foo'), Python將會(huì)拋出ValueError。
      但是我們對(duì)此并不擔(dān)心,因?yàn)槲覀兛梢钥隙╫ffset一定可以被轉(zhuǎn)換,正則表達(dá)式\d{1,2}一定會(huì)從URL中獲得數(shù)字。
      這也從另一個(gè)側(cè)面證明了URLconf的優(yōu)雅:它相當(dāng)清楚地提供了一個(gè)對(duì)輸入的校驗(yàn)。
      程序的下一行揭示了我們對(duì)offset做類型轉(zhuǎn)換的原因,這行代碼計(jì)算了當(dāng)前的時(shí)間加上一個(gè)時(shí)間偏移量,這個(gè)偏移量的值就是offset
      保存計(jì)算的結(jié)果在變量dt.datetime.timedelta函數(shù)需要的輸入?yún)?shù)就是整型。
      下一行我們構(gòu)造一個(gè)html的輸出,和在current_datetime函數(shù)中類似。
      最后,和current_datetime函數(shù)一樣,我們返回一個(gè)HttpResponse對(duì)象。
      好了,我們訪問http://127.0.0.1:8000/now/plus3hours/可以驗(yàn)證它工作了
      然后我們試試http://127.0.0.1:8000/now/plus100hours/,Django顯示“Page not found”錯(cuò)誤
      http://127.0.0.1:8000/plushours/也會(huì)顯示404錯(cuò)誤,因?yàn)槲覀冎唤邮?個(gè)或2個(gè)數(shù)字的參數(shù)

      Django良好的出錯(cuò)頁面
      我們將offset = int(offset)注釋掉
      # offset = int(offset)
      然后重新訪問/now/plus3hours,你將看到一個(gè)很多信息的出錯(cuò)頁面,包括TypeError信息在最上面:
      “unsupported type for timedelta hours component: str”
      發(fā)生了什么?
      datetime.timedelta函數(shù)預(yù)期hours參數(shù)為integer類型,但我們注釋掉了把offset轉(zhuǎn)化為integer的代碼
      這導(dǎo)致datetime.timedelta產(chǎn)生TypeError,只是典型的每個(gè)程序員容易出現(xiàn)的小bug
      中一些需要注意的地方:
      1,頁面的頂端顯示的是關(guān)于異常的主要信息:異常的類型,異常的參數(shù),導(dǎo)致異常的文件和行數(shù)
      2,接下來頁面顯示完整的異常的Python traceback,在stack的每個(gè)frame里Django都顯示了文件名、方法名、行數(shù)和該行代碼
      點(diǎn)擊暗灰色的代碼,你可以看到出錯(cuò)行前后的幾行代碼,讓你得到上下文
      點(diǎn)擊“Local vars”可以看到所有的本地變量的列表,變量值,出錯(cuò)點(diǎn)等,這個(gè)debug信息是很有價(jià)值的
      3,點(diǎn)擊在“Traceback”下面的“Switch to copy-and-paste view”將切換到可以很容易復(fù)制粘貼的版本
      當(dāng)你想同他人分享異常信息或得到技術(shù)支持時(shí)(Django IRC聊天室或者Django用戶郵件列表)可以很好的利用它
      4,“Request information”包括大量的產(chǎn)生錯(cuò)誤的Web請求的信息,GET和POST信息,cookie值和meta信息如CGI頭部等
      下面的“Settings”部分列出了當(dāng)前Django安裝的所有設(shè)置信息,后面我們會(huì)慢慢解釋這些
      Django錯(cuò)誤頁面在模板語法錯(cuò)誤等情況下會(huì)顯示更豐富的信息,現(xiàn)在去掉注釋offset=int(offset)
      你是那種喜歡用print語句debug 的程序員嗎?使用Django錯(cuò)誤頁面就可以做到這點(diǎn),不需要print語句
      你可以臨時(shí)插入assert False來觸發(fā)錯(cuò)誤頁面,后面我們會(huì)解釋更高級(jí)的debug方法
      很顯然大部分這些錯(cuò)誤信息是敏感的,它暴露了你的Python代碼和Django配置的五臟六腑
      把這些信息顯示到網(wǎng)上是愚蠢的,心懷惡意的人可能會(huì)在你的網(wǎng)站里面做骯臟的事情
      無論如何,后面我們會(huì)提到怎樣去除debug模式

      練習(xí)
      這里是一些鞏固本章知識(shí)的練習(xí),我們在這里介紹了一些新的技巧
      1,創(chuàng)建另一個(gè)視圖hours_behind,類似于hours_ahead,只不過顯示過去的時(shí)間偏移量
      這個(gè)視圖應(yīng)該綁定到/now/minusXhours/,這里X是偏移量小時(shí)數(shù)
      2,一旦你做完練習(xí)1,一個(gè)良好的程序員會(huì)發(fā)現(xiàn)hours_ahead和hours_behind非常類似,這顯得多余了
      把這兩個(gè)方法合并到單獨(dú)的一個(gè)方法hour_offset,URL還是保持/now/minusXhours/和/now/plusXhours/不變
      別忘了根據(jù)偏移量是正還是負(fù)來改變HTML代碼,“In X hour(s)”或者“X hour(s) ago”
      3,讓我們更專業(yè)一點(diǎn),允許/now/plus1hour/和/now/plus2hours/,但是不允許/now/plus1hours/和/now/plus2hour/
      4,在HTML的顯示里,如果偏移量是個(gè)位數(shù),使用hour,否則使用hours

      答案
      1,hours_behind視圖:
      Java代碼 復(fù)制代碼
      1. def hours_behind(request, offset):   
      2.     offset = int(offset)   
      3.     dt = datetime.datetime.now() - datetime.timedelta(hours=offset)   
      4.     html = "%s hour(s) ago, it was %s." % (offset, dt)   
      5.     return HttpResponse(html)  

      URL模式:
      Java代碼 復(fù)制代碼
      1. (r'^now/minus(\d{1,2})hours/$', hours_behind),  

      2,hour_offset視圖:
      Java代碼 復(fù)制代碼
      1. def hour_offset(request, plus_or_minus, offset):   
      2.     offset = int(offset)   
      3.     if plus_or_minus == 'plus':   
      4.         dt = datetime.datetime.now() + datetime.timedelta(hours=offset)   
      5.         html = 'In %s hour(s), it will be %s.' % (offset, dt)   
      6.     else:   
      7.         dt = datetime.datetime.now() - datetime.timedelta(hours=offset)   
      8.         html = '%s hour(s) ago, it was %s.' % (offset, dt)   
      9.     html = '%s' % html   
      10.     return HttpResponse(html)  

      URL模式:
      Java代碼 復(fù)制代碼
      1. (r'^now/(plus|minus)(\d{1,2})hours/$', hour_offset),  

      3,URL模式:
      Java代碼 復(fù)制代碼
      1. (r'^now/(plus|minus)(1)hour/$', hour_offset),   
      2. (r'^now/(plus|minus)([2-9]|\d\d)hours/$', hour_offset),  

      其中“|”表示“or”,上面的模式表示匹配模式[2-9]或者\(yùn)d\d
      即匹配一個(gè)2到9的數(shù)字或者匹配兩個(gè)數(shù)字
      4,hour_offset視圖:
      Java代碼 復(fù)制代碼
      1. def hour_offset(request, plus_or_minus, offset):   
      2.     offset = int(offset)   
      3.     if offset == 1:   
      4.         hours = 'hour'  
      5.     else:   
      6.         hours = 'hours'  
      7.     if plus_or_minus == 'plus':   
      8.         dt = datetime.datetime.now() + datetime.timedelta(hours=offset)   
      9.         output = 'In %s %s, it will be %s.' % (offset, hours, dt)   
      10.     else:   
      11.         dt = datetime.datetime.now() - datetime.timedelta(hours=offset)   
      12.         output = '%s %s ago, it was %s.' % (offset, hours, dt)   
      13.     output = '%s' % output   
      14.     return HttpResponse(output)  



      安徽新華電腦學(xué)校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
      国产午夜福三级在线播放_亚洲精品成a人片在线观看_亚洲自慰一区二区三区_久久棈精品久久久久久噜噜
      <source id="4vppl"><ins id="4vppl"></ins></source>
      <u id="4vppl"><sub id="4vppl"><label id="4vppl"></label></sub></u>
      <object id="4vppl"></object>
    1. <u id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></u>

      <object id="4vppl"></object>
      <b id="4vppl"><sub id="4vppl"><tr id="4vppl"></tr></sub></b>

        <i id="4vppl"><thead id="4vppl"></thead></i>

        <thead id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></thead>
        最新国产在线AⅤ精品 | 中文手机字幕大香视频蕉 | 亚洲国产精品久久久天堂麻豆 | 五月天婷婷缴情五月欧美激情 | 亚洲日韩在线第二页 | 亚洲人成网站日本片 |