Django的视图层简介
生活随笔
收集整理的這篇文章主要介紹了
Django的视图层简介
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Django的視圖層
視圖函數
所謂視圖函數,其實就是我們Django項目中各個應用中的views.py文件中定義的每個用來處理URL路由映射到這里的邏輯函數。一個視圖函數簡稱視圖,它是個簡單的Python 函數,它接受Web請求并且返回Web響應。響應可以是一張網頁的HTML內容,一個重定向,一個404錯誤,一個XML文檔,或者一張圖片,任何東西都可以。但是需要注意的是,無論視圖本身包含什么邏輯,都要返回響應。
下面是一個返回當前日期和時間作為HTML文檔的視圖:
from django.shortcuts import render, HttpResponse, HttpResponseRedirect, redirect import datetimedef current_datetime(request):now = datetime.datetime.now()html = "<html><body>It is now %s.</body></html>" % nowreturn 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 datetimen = datetime.datetime.now()now = n.strftime('%Y-%m-%d:%X')return render(request,'index.html',{'datetime':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頁面錯誤信息,訪問流量白白喪失;再者某些注冊了多個域名的網站,也需要通過重定向讓訪問這些域名的用戶自動跳轉到主站點等。
對于有關重定向狀態碼301與302的區別說明如下:
1.共同點:301和302狀態碼都表示重定向,就是說瀏覽器在拿到服務器返回的這個狀態碼后會自動跳轉到一個新的URL地址,這個地址可以從響應的Location首部中獲取(用戶看到的效果就是他輸入的地址A瞬間變成了另一個地址B)
2.不同點:301表示舊地址A的資源已經被永久地移除了(這個資源不可訪問了),搜索引擎在抓取新內容的同時也將舊的網址交換為重定向之后的網址;302表示舊地址A的資源還在(仍然可以訪問),這個重定向只是臨時地從舊地址A跳轉到地址B,搜索引擎會抓取新的內容而保存舊的網址。
轉載于:https://www.cnblogs.com/paulwhw/p/9375766.html
總結
以上是生活随笔為你收集整理的Django的视图层简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: redux小结
- 下一篇: 操作系统01_进程和线程管理