視圖部分

所謂視圖函數,其實就是咱們Django項目中各個應用中的views.py文件中定義的每一個用來處理URL路由映射到這裏的邏輯函數。一個視圖函數簡稱視圖,它是個簡單的Python 函數,它接受Web請求而且返回Web響應。響應能夠是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片,任何東西均可以。可是須要注意的是,不管視圖自己包含什麼邏輯,都要返回響應。
下面是一個返回當前日期和時間做爲HTML文檔的視圖:
from django.shortcuts import render, HttpResponse, HttpResponseRedirect, redirect import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
在上面的代碼中:
1.首先,咱們從django.shortcuts模塊導入了HttpResponse類,以及Python的datetime庫。
2.接着,咱們定義了current_datetime函數。它就是視圖函數。每一個視圖函數都使用HttpRequest對象做爲第一個參數,而且一般稱之爲request。可是視圖函數的名稱並不重要;不須要用一個統一的命名方式來命名,以便讓Django識別它。咱們將其命名爲current_datetime,是由於這個名稱可以精確地反映出它的功能。
3.這個視圖會返回一個HttpResponse對象,其中包含生成的響應。每一個視圖函數都負責返回一個HttpResponse對象。
在視圖層咱們須要掌握兩個對象:請求對象(HttpRequest)響應對象(HttpResponse)

請求對象

請求對象的經常使用屬性

django將請求報文中的請求行、首部信息、內容主體封裝成 HttpRequest 類中的屬性。 除了特殊說明的以外,其餘均爲只讀的。
1.請求方式:request.methon:通常狀況下,在瀏覽器的地址欄直接訪問時是GET,用form的submit提交的方式是POST。
2.請求數據:request.GET與request.POST:這兩個方式哪個有值,徹底取決於請求的方式。這裏須要注意的是獲得的結果是一個「字典」。對於Get請求方式,若是瀏覽器的地址欄輸入的是:http://127.0.0.1:8000/app01/index/?name=whw&age=22,那request.GET獲得的結果是{'name':'whw','age':'22'}。而對於POST請求方式,字典的key值是表單中input的name屬性的值,而對應的value是input中用戶輸入的值。
3.請求路徑:request.path:請求路徑的組成是:協議://IP:port/路徑?參數(GET請求數據)。好比說有一個GET請求http://127.0.0.1:8000/app01/index/?name=whw&age=22,那這個請求答應出來的路徑就是/app01/index/。你們不要被後面的迷惑了,由於index後面是"?",咱們能夠把它看做是路徑與參數的分隔符,因此咱們打印路徑的時候是不會打印"?"後面的參數的!

請求對象的經常使用方法

1.get_full_path()方法:關於這個方法咱們須要注意一點就能夠了,還拿上面的「請求數據」中的例子來說,若是GET請求方式輸入:http://127.0.0.1:8000/app01/index/?name=whw&age=22。path屬性得出的只是/app01/index/get_full_path()方法得出的是:/app01/index/?name=whw&age=22
2.is_ajax()方法——判斷請求是否是ajax方法。

響應對象

咱們知道,對於任何一個視圖函數必需要返回響應對象,而返回的響應對象主要有三種形式:HttpResponse()render()redirect()。另外須要注意的一點是,調用者三個方法前須要先在views.py文件中引入:from django.shortcuts import render,HttpResponse,HttpResponseRedirect,redirect

HttpResponse()

對於HttpResponse(),它比較簡單,由於咱們在括號內直接加一個字符串做爲響應體就能夠了。咱們能夠拿上面的「返回當前日期和時間做爲HTML文檔」的例子做爲參考。

render()

render()是一個很重要的方法。它的做用是將一個模板頁面中的模板語法進行渲染,最終渲染成一個html頁面做爲響應體返回給用戶。
render()的語法是:render(request, template_name[, context])。合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的HttpResponse對象。
render()的參數介紹:
(1)request:用於生成響應的請求對象。
(2)template_name:要使用的模板的完整名稱,可選的參數
(3)context:添加到模板上下文的一個字典。默認是一個空字典。若是字典中的某個值是可調用的,視圖將在渲染模板以前調用它。
例如,咱們如今用render()方法實現「返回當前時間」的功能,視圖函數能夠這樣寫(路由控制部分省略):
def index(request): import datetime n = datetime.datetime.now() now = n.strftime('%Y-%m-%d:%X') return render(request,'index.html',{'ctime':now})
模板文件index.html中的內容爲:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h4>當前時間:{{ ctime }}</h4> </body> </html>
須要注意的是:瀏覽器並不認識模板語法,render方法找到index.html文件以後,它先檢查裏面有沒有模板語法,若是有模板語法先將傳入的值作「替換」,就是將視圖中字典{'datetime':now}中datetime鍵對應的value值now做爲參數傳給瀏覽器,傳完參數以後index.html纔是一個html文件了,而後render再將html文件那一堆東西傳給瀏覽器,因此瀏覽最後顯示的是now的值。這個「替換」的過程十分重要,請你們務必理解並掌握!

redirect()——重定向

咱們能夠傳遞要重定向的一個硬編碼的URL:
def my_view(request): ... return redirect('/some/url/')
也能夠是一個完整的URL:
def my_view(request): ... return redirect('http://example.com/')
對於重定向的使用場景,這裏作了一下三點小結:
(1)網站調整(如改變網頁目錄結構)。
(2)網頁被移到一個新地址。
(3)網頁擴展名改變(如應用須要把.php改爲.Html或.shtml)。這種狀況下,若是不作重定向,則用戶收藏夾或搜索引擎數據庫中舊地址只能讓訪問客戶獲得一個404頁面錯誤信息,訪問流量白白喪失;再者某些註冊了多個域名的網站,也須要經過重定向讓訪問這些域名的用戶自動跳轉到主站點等。
對於有關重定向狀態碼301302的區別說明以下:
1.共同點:301和302狀態碼都表示重定向,就是說瀏覽器在拿到服務器返回的這個狀態碼後會自動跳轉到一個新的URL地址,這個地址能夠從響應的Location首部中獲取(用戶看到的效果就是他輸入的地址A瞬間變成了另外一個地址B)
2.不一樣點:301表示舊地址A的資源已經被永久地移除了(這個資源不可訪問了),搜索引擎在抓取新內容的同時也將舊的網址交換爲重定向以後的網址;302表示舊地址A的資源還在(仍然能夠訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓取新的內容而保存舊的網址。
相關文章
相關標籤/搜索