在Django MTV模式中,View視圖負責業務邏輯部分,路由系統接收到HTTP請求,並將任務分配給相應的視圖函數,由視圖函數來負責響應這個請求。不管視圖自己包含什麼邏輯,都要返回響應。
在這裏HTTP請求中產生兩個核心對象:
HTTP請求:HttpRequest對象
HTTP響應:HttpResponse對象
所在位置:django.http
在Django項目中,一個app內的視圖函數都放在views.py中php
def register(request): # 一個視圖函數 print(request)
HttpRequest對象的屬性和方法html
request.path 獲取路徑 request.get_full_path() 帶數據的路徑 request.method 請求方式("POST"/"GET") request.GET 包含全部HTTP GET參數的類字典對象 request.POST 包含全部HTTP POST參數的類字典對象 name = request.POST.get("user") 獲取提交的數據(form表單中name屬性爲user的 用戶輸入文本值) pwd = request.POST.get("pwd")(form表單中name屬性爲pwd的 用戶輸入的文本值) 服務器收到空的POST請求的狀況也是可能發生的,也就是說,表單form經過HTTP POST方法提交請求,可是表單中可能沒有數據,所以不能使用 if request.POST來判斷是否使用了HTTP POST 方法;應該使用 if request.method=="POST" request.COOKIES 包含全部cookies的標準Python字典對象;keys和values都是字符串。 FILES: 包含全部上傳文件的類字典對象;FILES中的每個Key都是<input type="file" name="" />標籤中name屬性的值,FILES中的每個value同時也是一個標準的python字典對象,包含下面三個Keys: filename: 上傳文件名,用字符串表示 content_type: 上傳文件的Content Type content: 上傳文件的原始內容 request.user 是一個django.contrib.auth.models.User對象,表明當前登錄的用戶。若是訪問用戶當前沒有登錄,user將被初始化爲django.contrib.auth.models.AnonymousUser的實例。 你能夠經過user的is_authenticated()方法來辨別用戶是否登錄:if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware時該屬性纔可用 request.session 惟一可讀寫的屬性,表明當前會話的字典對象;本身有激活Django中的session支持時該屬性纔可用。 request.META 包含了全部本次HTTP請求的Header信息,是一個python字典。這個字典中常見的鍵值有: HTTP_REFERER 進站前連接網頁,能夠用來統計網站流量來源。 (請注意,它是REFERRER的筆誤) HTTP_USER_AGENT 用戶瀏覽器標識,能夠獲知瀏覽器的型號版本等信息。 REMOTE_ADDR 客戶端IP(若是申請是通過代理服務器的話,那麼它多是以逗號分割的多個IP地址)
HttpResponse對象的屬性和方法python
頁面渲染: 推薦用render(request,"模板.html",{}) 第三個參數能夠是鍵值對,也能夠是locals()函數 頁面跳轉: redirect("路徑") locals() 能夠直接將函數中全部的變量傳給模板 render和redirect的區別: redirect跳轉將會使url發生改變,而render不會改變。要在合適的時候使用redirect
示例:數據庫
url.py中: url(r"login", views.login), url(r"yse", views.yes), views.py中: def login(request): if request.method == "POST": if request.POST.get("user") == "alex" and request.POST.get("pwd") == "666": return redirect("/yes/") return render(request,"login.html",locals()) def yes(request): name = "alex" return render(request,"yes.html",locals()) login.html中: <form action="/register/" method="post"> <div class="input"> <input type="text" class="inputs" placeholder="用戶名" name="user"> </div> <div class="input"> <input type="password" class="inputs" placeholder="密碼" name="pwd"> </div> <input type="button" class="button" value="註冊"> </form> yes.html中: <h1>{{ name }}你好!</h1> 總結: render和redirect的區別: 1. render的頁面須要模板語言渲染,即須要將數據庫的數據加載到html,那麼全部的這些數據除了寫在yes的視圖函數中,必須還要寫在login中,代碼重複,沒有解耦. 2. 最重要的: url沒有跳轉到/yes/,而是還在/login/,因此當刷新後又得從新登陸。
轉載於猿2048:➭《Django view(視圖)》django