Django視圖

視圖的作用流程

一、錯誤視圖

    

404視圖:找不到網頁(url匹配不成功時返回)時返回

500視圖:在視圖代碼中出現錯誤(服務器代碼錯誤)

400視圖:錯誤出現在客戶的操作

二、HttpRequest對象

(1)概述:服務器接收http請求後,會根據報文創建HttpRequest對象視圖的第一個參數就是HttpRequest對象,django創建的,之後調用視圖時傳遞給視圖。

(2)屬性:

path:請求的完整路徑(不包括域名和端口)

method:表示請求的方式,常用的有GET,POST

encoding:表示瀏覽器提交的數據的編碼方式,一般爲utf-8

GET:類似於字典的對象,包含了get請求的所有參數

POST:類似於字典的對象,包含了post請求的所有參數

FILES:類似字典的對象,包含了所有上傳的文件

COOKIES:字典,包含所有的cookie

session:類似字典的對象,表示當前會話

(3)方法:

is_ajax():如果是通過XMLHttpRequest發起的,返回True

get():根據鍵獲取值,只能獲取一個值

getlist():將鍵的值以列表的形式返回,可以獲取多個值

三、GET屬性

獲取瀏覽器傳遞過來數據:例子:www.sunck.wang/abc?a=1&b=2&c=3

(1)get()

www.sunck.wang/abc?a=1&b=2&c=3

urls.py文件中:

url(r'^get1', views.get1),   #結尾不能加$,否則無法匹配

views.py文件中:

def get1(request):
    a = request.GET.get('a')
    b = request.GET.get('b')
    c = request.GET.get('c')
    return HttpResponse(a + " " + b + " " + c)

(2)getlist()

 www.sunck.wang/abc?a=1&a=2&c=3

urls.py文件中:

url(r'^get2', views.get2),

views.py文件中:

def get2(request):
    a = request.GET.getlist('a')
    a1 = a[0]
    a2 = a[1]
    c = request.GET.get('c')
    return HttpResponse(a1 + " " + a2 + " " + c)

四、POST屬性

使用表單模擬POST請求:

首先,關閉CSRF:project\project\settings.py   :

 MIDDLEWARE = [
                    'django.middleware.security.SecurityMiddleware',
                    'django.contrib.sessions.middleware.SessionMiddleware',
                    'django.middleware.common.CommonMiddleware',
                    # 'django.middleware.csrf.CsrfViewMiddleware',
                    'django.contrib.auth.middleware.AuthenticationMiddleware',
                    'django.contrib.messages.middleware.MessageMiddleware',
                    'django.middleware.clickjacking.XFrameOptionsMiddleware',
                ]

示例:

templates/App/register.html文件中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>註冊</title>
</head>
<body>
    <form action="register/" method="post">
        姓名:<input type="text" name="name" value=""/>
        <hr/>
        性別:<input type="radio" name="gender" value="1">男<input type="radio" name="gender" value="0">女
        <hr/>
        年齡:<input type="text" name="age" value=""/>
        愛好:<input type="checkbox" name="hobby" value="power">權利<input type="checkbox" name="hobby" value="money">金錢<input type="checkbox" name="hobby" value="boy">美男<input type="checkbox" name="hobby" value="girl">美女
        <hr/>
        <input type="submit" value="註冊">
    </form>
</body>
</html>

views.py文件中

def showregister(request):
    return render(request, 'myApp/register.html',)
def register(request):
    name = request.POST.get("name")    #接收表單提交上來的數據
    gender = request.POST.get("gender")
    age = request.POST.get("age")
    hobby = request.POST.getlist("hobby")
    return HttpResponse("註冊成功!")
五、HttpResponseRedirect重定向

功能:自動跳轉到另一個頁面,重定向,服務器端的跳轉

HttpResponseRedirect 和 redirect

示例:

from django.http import HttpResponseRedirect
from django.shortcuts import redirect
def redirect1(request):
    # return HttpResponseRedirect('/redirect2')
    return redirect('/redirect2')     #跳轉到redirect2的路徑上
def redirect2(request):
    return HttpResponse("我是重定向後的視圖")
六、狀態保持
   

http協議是無狀態的,每次請求都是一次新的請求,它不記得之前的請求。 

客戶端與服務器的一次通信就是一次會話,實現狀態的保持,在客戶端或服務端存儲有關會話的數據

存儲的方式:

cookie:所有數據存儲在客戶端,不要存儲敏感的數據

session:所有的數據存儲在服務端,在客戶端用cookie存儲session_id

狀態保持的目的在一段時間內跟蹤請求者的狀態,可以實現跨頁面訪問當前的請求者的數據

注意:不同的請求者之間不會共享這個數據,與請求者一一對應

啓用session        

project\project\settings.py中

INSTALLED_APPS    'django.contrib.sessions',

MIDDLEWARE    'django.contrib.sessions.middleware.SessionMiddleware',

使用session

啓用session後,每個httpRequest對象都有一個session屬性

 get[key, default=None]    根據鍵獲取session

clear()    清空所有會話

flush()    刪除當前會話並刪除會話的cookie

示例:

建立主頁面的html:templates/myApp/main.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首頁</title>
</head>
<body>
    <h1>歡迎:{{username}}</h1>
    <a href="/sunck/login">登錄</a>
    <a href="/sunck/quit">退出登錄</a>
</body>
</html>

登錄頁面:templates/myApp/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登錄</title>
</head>
<body>
    <form action="/sunck/showmain/" method="post">
        <input type="text" name="username">
        <input type="submit" value="登錄">
    </form>
</body>
</html>

views.py:

def main(request):
    #取session
    username= request.session.get('name')      #拿取session中的數據
    return render(request,'myApp/main.html',{'username':username})
def login(request):
    return render(request,'myApp/login.html')
def showmain(request):
    username=request.POST.get('username')    #從表單form中拿取數據
    print("************")
    request.session['name']=username   #將數據傳給session
    request.session.set_expiry(10)     #設置session過期時間
    return HttpResponseRedirect("/sunck/main")      #跳轉到主頁面

def quit(request):      #用作清除session
    #清除session
    #logout(request)
    request.session.clear()
    return HttpResponseRedirect("/sunck/main")

urls.py:

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^main/$',views.main),
    url(r'^login/$',views.login),
    url(r'^showmain/$',views.showmain),
    url(r'^quit/$',views.showmain),
]


發佈了45 篇原創文章 · 獲贊 118 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章