状态保持
http协议是无状态的,下一次去访问一个页面时并不知道上一次对这个页面做了什么
一、Cookie
cookie是由服务器生成,存储在浏览器端的一小段文本信息。
1、cookie的特点
1)以键值对方式进行存储
2)通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器。request.COOKKIES
3)cookie是基于域名安全的
4)cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期
可以设置cookie过期时间:
from datetime import date, datetime, timedelta
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
# /set_cookie
def set_cookie(request):
'''设置cookie信息'''
response = HttpResponse('设置cookie')
# 设置一个cookie信息,名字为num,值为1
# response.set_cookie('num', 1, max_age=14*24*3600) # 设置过期时间为两> 周
response.set_cookie('num', 1, expires=datetime.now()+timedelta(days=14))
# 返回response
return response
# /get_cookie
def get_cookie(request):
'''获取cookie的信息'''
# 取出cookie num的值
num = request.COOKIES['num']
return HttpResponse(num)
2、案例(记住用户名)
思路:
1)在login表单中设置checkbox记住用户名,设置id为remember,在视图中通过request.POST.get(‘remember’)时如果表单提交时没有勾选记住用户名,则返回值为None,如果勾选了,则返回值为on;
2)在登录校验函数中,判断用户名密码正确后,判断是否需要记住用户名,如果记住了,则将用户名添加到response里的cookie中,最后将重定向返回;
3)第二次访问login登录页面时,就会通过视图的login函数获取cookie中的username值填充自动填充到表单用户名里面。
为了获取username值,需要判断是否username存在request.COOKIES中,如果存在则赋值给局域变量username,如果不存在则赋值空字符串给局部变量username,最后返回参数到表单中获取。
视图views.py源码如下
from django.shortcuts import render, redirect
def login(request):
'''显示登录页面'''
# 获取cookie username
if 'username' in request.COOKIES:
# 获取记住的用户名
username = request.COOKIES['username']
else:
username = ''
return render(request, 'xm20200425/login.html', {'username':username})
def login_check(request):
'''登录校验视图'''
# request.POST 保存的是post方式提交的参数
# request.GET 保存的是get方式提交的参数
# 1.获取提交的用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
remember = request.POST.get('remember')
# print(username,':',password)
# 2.进行登录的校验
# 实际开发:根据用户名和密码查找数据库
# 模拟:smart 123
if username == 'smart' and password =='123':
# 用户名密码正确,跳转到首页
response = redirect('/index')
# 判断是否需要记住用户名
if remember == 'on':
# 设置cookie username过期时间为1周
response.set_cookie('username', username, max_age=7*24*3600)
return response
else:
# 用户名或密码错误,跳转到登录页面
return redirect('/login')
login.html源码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登陆页面</title>
</head>
<body>
POST:提交的参数在请求头,数据安全性要求比较高的时候使用
GET:提交的参数在url中
<form method="post" action="/login_check">
用户名:<input type="text" name="username" value="{{ username }}"><br/>
密码:<input type="password" name="password"><br/>
<input type="checkbox" name="remember">记住用户名<br/>
<input type="submit" value="登陆">
</form>
</body>
</html>
二、session
session存储在服务器中。
1、session的特点
1)session是以键值对进行存储的
2)session依赖于cookie
3)session也是有过期时间的
4)session存的值是什么类型,获取得到的值就是什么类型
2、对象及方法
1)以键值对的格式写session
request.session['键'] = 值
2)根据键读取值
request.session.get('键', 默认值)
3)清除所有session,在存储数据库表中删除值部分
request.session.clear()
4)清除session数据,在存储数据库表中删除session的整条数据
request.session.flush()
5)删除session中的指定键及值,在存储中只删除某个键及对应的值
del request.session['键']
6)设置会话的超时时间,如果没有指定过期时间则两个星期后过期
request.session.set_expiry(value)
# 如果value是一个整数,会话的session_id_cookie将在value秒没有活动后过期
# 如果value为0,那么用户会话的session_id_cookie将在用户的浏览器关闭时过期
# 如果value为None,那么会话的session_id_cookie两周之后过期
7)查看session中是否存在对应的键名称,返回值为布尔类型
request.session.has_key('键')
session在视图views.py中的操作源码如下
from django.shortcuts import render, redirect
from datetime import date, datetime, timedelta
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
def login(request):
'''显示登录页面'''
# 判断用户是否登录
if request.session.has_key('islogin'):
# 用户已登录,跳转到首页
return redirect('/index')
# 获取cookie username
if 'username' in request.COOKIES:
# 获取记住的用户名
username = request.COOKIES['username']
else:
username = ''
return render(request, 'xm20200425/login.html', {'username':username})
def login_check(request):
'''登录校验视图'''
# request.POST 保存的是post方式提交的参数
# request.GET 保存的是get方式提交的参数
# 1.获取提交的用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
remember = request.POST.get('remember')
# print(username,':',password)
# 2.进行登录的校验
# 实际开发:根据用户名和密码查找数据库
# 模拟:smart 123
if username == 'smart' and password =='123':
# 用户名密码正确,跳转到首页
response = redirect('/index')
# 判断是否需要记住用户名
if remember == 'on':
# 设置cookie username过期时间为1周
response.set_cookie('username', username, max_age=7*24*3600)
# 记住用户登录状态
# 只要session中有islogin,就认为用户已登录
request.session['islogin'] = True
return response
else:
# 用户名或密码错误,跳转到登录页面
return redirect('/login')
# /set_session
def set_session(request):
'''设置session'''
request.session['username'] = 'smart'
request.session['age'] = 18
request.session.set_expiry(5)
return HttpResponse('设置session')
# /get_session
def get_session(request):
'''获取session'''
username = request.session['username']
age = request.session['age']
return HttpResponse(username + ':' + str(age))
# /clear_session
def clear_session(request):
'''清除session信息'''
request.session.clear()
return HttpResponse('清除成功')
三、cookie和session的应用场景
cookie:记住用户名,安全性要求不高。
session:涉及到安全性要求比较高的数据,如银行卡账户和密码。