视图的作用流程:
一、错误视图
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),
]