Django view(檢視)
阿新 • • 發佈:2018-11-17
在Django MTV模式中,View檢視負責業務邏輯部分,路由系統接收到HTTP請求,並將任務分配給相應的檢視函式,由檢視函式來負責響應這個請求。無論檢視本身包含什麼邏輯,都要返回響應。
在這裡HTTP請求中產生兩個核心物件:
- HTTP請求:HttpRequest物件
- HTTP響應:HttpResponse物件
所在位置:django.http
在Django專案中,一個app內的檢視函式都放在views.py中
def register(request): # 一個檢視函式 print(request)
HttpRequest物件的屬性和方法
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物件的屬性和方法
頁面渲染: 推薦用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/,所以當重新整理後又得重新登入。