19 cookie session
状态保持:
http协议是无状态的,下一次去访问一个页面时并不知道上一次对这个页面做了什么。
记录这些信息的两种方式cookie和session
应用场景:
cookie:记住用户名,安全性要求不高
session:涉及安全性要求比较高的数据,银行卡账号密码等
1、cookie
由服务器生成,存储在浏览器端的一小段文本信息
.以键值对方式存储
.通过浏览器访问一个网站时,浏览器会将与网站相关的cookie发送给网站的服务器。request.COOKIES
.cookie是基于域名安全的。(只会发送与网站相关的cookie)
.设置cookie,需要一个HttpRespons类的对象,或者它的子类的对象,它的类中有一个set_cookie方法可以设置cookie信息
.浏览器发给服务器的cookie保存在request对象COOKIES中(request.COOKIES),这是一个标准的字典
def set_cookie(request): respons = HttpResponse('设置aaaa cookie') #设置一个cookie信息,名字为num,值为1,k可以设置多个cookie respons.set_cookie('num',1)
respons.set_cookie('num1',2) return respons def get_cookie(request): num = request.COOKIES['num'] return HttpResponse(num)
在浏览器关闭后,cookie就消失了,可以对cookie设置过期时间,set_cookie有两个属性都可以设置过期时间:
max_age是以秒为单位,下面是过期时间为2周:
def set_cookie(request): respons = HttpResponse('设置aaaa cookie') #设置一个cookie信息,名字为num,值为1 respons.set_cookie('num',1,max_age=14*24*3600) return respons
另外一个属性是expires,同样设置过期时间为2周:
from datetime import datetime,timedelta def set_cookie(request): respons = HttpResponse('设置aaaa cookie') #设置一个cookie信息,名字为num,值为1 # respons.set_cookie('num',1,max_age=14*24*3600) respons.set_cookie('num',1,expries=datetime.now()+timedelta(days=14)) return respons
2、session
存储在服务器端
以键值对存储
依赖于cookie
过期时间,默认两周
读取session:request.session['username'] 或者: request.session.get('键',默认值)
设置session: resquest.session['username'] = 'admin'
清除所有session,删除存储中值的部分: request.session.clear()
清除session,删除整条数据:request.session.flush()
删除session中某个键值: del request.session['键']
设置过期时间:request.session.set_expiry(value) 如果value是0,关闭浏览器失效,如果是整数则为秒,为空默认2周
判断session中是否有某个键:request.session.has_key('键')
例子:session记录如果登陆过,直接跳转到首页:
views.py
def login(request): if request.session.has_key('islogin'): return redirect('/index') else: if 'user' in request.COOKIES: username = request.COOKIES['user'] else: username='' return render(request,'login.html',{'username':username}) def login_ajax_check(request): '''ajax登陆校验''' #获取用户名和密码 username = request.POST.get('username') password = request.POST.get('password') print(remember) #进行校验,返回json数据 if username == 'test' and password == '123': request.session['username'] = username request.session['password'] = password request.session['islogin'] = True return JsonResponse({'res': 1}) else: return JsonResponse({'res':0})
login.html
<!DOCTYPE html>
<html>
<head>
<title>login</title>
<script type="text/javascript" src="/static/js/jquery.js"></script>
<script type="text/javascript">
$(function(){
$('#btn_login').click(function(){
//获取用户名和密码
username = $('#username').val()
password = $('#password').val()
//发起post方式的ajax请求/login_ajax_check,携带用户名和密码
$.ajax({
url:'/login_ajax_check',
type:'post',
data:{'username':username,'password':password,},
dataType:'json',
}).done(function(data){
//登陆成功返回{'res':1}
//登陆失败返回{'res':0}
if(data.res==0){
$('#error').show().html('用户名或密码错误!')
}
else{
//跳转到首页
location.href = '/index'
}
})
})
})
</script>
<style type="text/css">
#error{
display: none;
color: red;
}
</style>
</head>
<body>
<!-- method有两个选项:post和get,post:信息会在请求头部中,get:信息会直接在url中。post更安全一些 -->
<!-- <form method="post" action="/check">
user:<input type="text" name="username">
pass:<input type="password" name="password">
<input type="submit" name="提交">
</form>
不用表单提交,下面改用ajax
-->
user:<input type="text" id="username" value="{{username}}">
pass:<input type="password" id="password"><br>
<!-- <input type="checkbox" id="remember">记住 <br> -->
<input type="button" id='btn_login' value="提交">
<div id='error'></div>
</body>
</html>

浙公网安备 33010602011771号