Django view(視圖)

在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

相關文章
相關標籤/搜索