状态保持
http协议是无状态的,即下一次去访问一个页面时并不知道上一次这个页面做了什么。
在web中记录信息的两种方式:cookie 和 session
·
Cookie
是以服务器生成,存储在浏览器端的一小段文本信息
特点:
1)以键值对方式进行存储。
2)通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器。 request.COOKIES
3)cookie 是基于域名安全的。
4) cookie 是有过期时间的,如果不指定,默认关闭浏览器后 cookie 就会过期。
代码实例:
views.py
from django.http import HttpResponse
def set_cookie(request):
'''设置cookie信息'''
# 创建一个HttpResponse对象
response = HttpResponse('设置cookie')
# 设置一条cookie信息,设定过期时间为14天后
response.set_cookie('num', 1, max_age=14*24*3600)
return response
`
views.py
from django.http import HttpResponse
def get_cookie(resquest):
'''获得cookie值'''
# request属性COOKIES字典中保存了所有的cookie键值对,通过COOKIES取出对应的值
num = request.COOKIES['num']
return HttpResponse(num)
·
·
登录案例–通过cookie记住用户名和密码
views.py
def login_ajax(request):
if 'username' in request.COOKIES:
username = request.COOKIES['username']
else:
username = ''
if 'password' in request:
password = request.COOKIES['password']
else:
password = ''
return render(request, 'booktest/login_ajax.html', {'username': username, 'password': password})
def login_ajax_check(request):
# 获取用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
# 获取是否记住用户名和密码的选项勾选状态,为None表示没有勾选,为on表示勾选
remember = request.POST.get('remember')
# 进行效验,返回json数据
try:
# 从数据库中获取姓名为username的对象
u1 = UserInfo.objects.get(username=username)
except:
return JsonResponse({'res': 0})
else:
if u1.password == int(password):
response = JsonResponse({'res': 1})
# 当数据库中存在该用户名和密码时设置cookie值,设置过期时间为一周
response.set_cookie('username', username, max_age=7*24*3600)
response.set_cookie('password', password, max_age=7*24*3600)
return response
else:
return JsonResponse({'res': 2})
·
login_ajax.html
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>ajax登陆页面</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
<script>
$(function(){
$('#btnLogin').click(function () {
// 获取用户名和密码
nameuser = $('#nameuser').val()
passqord = $('#password').val()
// 发起post ajax 请求
$.ajax({
'url':'login_ajax_check',
'type':'post',
'data':{'username':nameuser, 'password':passqord},
'datatype':'json'
}).success(function (data) {
// 登录成功{'res':1}
// 登录失败{'res':0}
if (data.res === 0){
$('#errmsg').show().html('用户名输入错误')
}
else if(data.res === 2){
$('#errmsg').show().html('密码输入错误')
}
else {
// 跳转到图书界面
location.href = '/books'
}
})
})
})
</script>
<style>
#errmsg{
display: none;
color: red;
}
</style>
</head>
<body>
<div>
用户名:<input type="text" id="nameuser" value="{{ username }}"><br/>
密码:<input type="password" id="password" value="{{ password }}"><br/>
<input type="checkbox" name="remember">记住用户名<br/>
<input type="button" id="btnLogin" value="登录">
<div id="errmsg"></div>
</div>
</body>
</html>
实验结果:
·
·
·
·
·
session
session存储在服务器端
特点:
1)session 是以键值对进行存储的
2)session 依赖于 cookie。唯一的 标识码保存在 sessionid cookie
中
3)session 也有过期时间,如果不指定,默认两周就会过期
设置session:request.session[‘username’] = ‘xxx’
获取session:request.session[‘username’]
·
通过HttpRequest对象的session属性进行读写操作
1)以键值对的格式写入session
request.session[‘键’] = 值
2)根据键读取值
request.session.get(‘键’, 默认值)
3)清除所有session,在存储中(数据库中django自建的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
两周之后过期。
·
代码实例:
views.py
from django.http import HttpResponse
def set_session(request):
request.session['name'] = 'name'
request.session['age'] = 18
return HttpResponse('设置session')
`
from django.http import HttpResponse
def get_session(request):
name = request.session['name']
age = request.session['age']
return HttpResponse(name+':'+str(age))
`
`
登录案例–记住用户登录状态,下次访问直接登录跳转不必输入用户和密码
代码实例:
views.py
def login_ajax(request):
# 当服务器session表中含有键isLogin时,直接转到图书界面
if request.session.has_key('isLogin'):
return render(request, 'booktest/books_display.html')
else:
if 'username' in request.COOKIES:
username = request.COOKIES['username']
else:
username = ''
if 'password' in request:
password = request.COOKIES['password']
else:
password = ''
return render(request, 'booktest/login_ajax.html', {'username': username, 'password': password})
def login_ajax_check(request):
# 获取用户名和密码
username = request.POST.get('username')
password = request.POST.get('password')
# 获取是否记住用户名和密码的选项勾选状态,为None表示没有勾选,为on表示勾选
remember = request.POST.get('remember')
# 进行效验,返回json数据
try:
# 从数据库中获取姓名为username的对象
u1 = UserInfo.objects.get(username=username)
except:
return JsonResponse({'res': 0})
else:
if u1.password == int(password):
response = JsonResponse({'res': 1})
# 当数据库中存在该用户名和密码时设置cookie值,设置过期时间为一周
response.set_cookie('username', username, max_age=7 * 24 * 3600)
response.set_cookie('password', password, max_age=7 * 24 * 3600)
# 利用session,设置用户已登录
request.session['isLogin'] = True
return response
else:
return JsonResponse({'res': 2})
login_ajax.html
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>ajax登陆页面</title>
<script src="/static/js/jquery-1.12.4.min.js"></script>
<script>
$(function(){
$('#btnLogin').click(function () {
// 获取用户名和密码
nameuser = $('#nameuser').val()
passqord = $('#password').val()
// 发起post ajax 请求
$.ajax({
'url':'login_ajax_check',
'type':'post',
'data':{'username':nameuser, 'password':passqord},
'datatype':'json'
}).success(function (data) {
// 登录成功{'res':1}
// 登录失败{'res':0}
if (data.res === 0){
$('#errmsg').show().html('用户名输入错误')
}
else if(data.res === 2){
$('#errmsg').show().html('密码输入错误')
}
else {
// 跳转到图书界面
location.href = '/books'
}
})
})
})
</script>
<style>
#errmsg{
display: none;
color: red;
}
</style>
</head>
<body>
<div>
用户名:<input type="text" id="nameuser" value="{{ username }}"><br/>
密码:<input type="password" id="password" value="{{ password }}"><br/>
<input type="checkbox" name="remember">记住用户名<br/>
<input type="button" id="btnLogin" value="登录">
<div id="errmsg"></div>
</div>
</body>
</html>
·
·
cookie和session的区别和应用场景
cookie:记住用户名。 安全性要求不高。
session:涉及到安全性要求比较高的数据。银行卡账户,密码,登陆状态等。
·
cookie保存在客户端
session保存在服务器端
·
cookie的值会直接显示出来
session的值会经过base64编码后保存
·
cookie在Django框架中通过HttpResponse的对象进行设置,获取
session在Django框架中通过request对象进行设置,获取