視圖的作用流程:
一、錯誤視圖
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),
]