1. 程式人生 > >Django view(檢視)

Django view(檢視)

在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/,所以當重新整理後又得重新登入。