一、cookie
1、 cookie是什么?
保存在浏览器上一组组键值对
服务器让浏览器进行保存的cookie,浏览器有权利是否进行保存,再次访问服务器的时候会携带着相应的cookie
2、什么要有cookie?
http协议是无状态,每次请求都是无关联的,没有办法保存状态。
使用cookie保存状态。
3、django的操作cookie
设置cookie
ret = HttpResponse('xxx')
ret.set_cookie(key,value,max_age=5)
ret.set_signed_cookie(key,value,max_age=5,salt='xxx')
获取cookie
request.COOKIES['is_login']
request.COOKIES.get('is_login')
request.get_signed_cookie(key,salt='xxx',default='')
删除cookie
ret.delete_cookie(key)
二、 session
1、session是什么?
保存在服务器上一组组键值对,依赖cookie
2、 为什么要用session?
cookie保存在浏览器上 不安全
cookie的长度受到限制
3、django中操作session
- 设置session
request.session[key] = value
request.session.setdefault(key,value)
- 获取session
request.session[key]
request.session.get(key)
- 删除session
del request.session[key] ——》删除某一个键值对
request.session.delete() ——》 删除该用户的所有的session数据,不删除cookie
request.session.flush() ——》 删除该用户的所有的session数据,删除cookie
- 设置超时时间
request.session.set_expiry()
- 清除所有过期的session
request.session.clear_expired()
4、配置
# Cookie name. This can be whatever you want.
SESSION_COOKIE_NAME = 'sessionid'
# Age of cookie, in seconds (default: 2 weeks).
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
# Whether to save the session data on every request.
SESSION_SAVE_EVERY_REQUEST = False
# Whether a user's session cookie expires when the Web browser is closed.
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
setting文件里需要有这两个配置
三、Cookie装饰器和登陆函数示例
1、装饰器
在装饰器里获取request里带的cookies,如果cookies不符合的话,则将请求重定向到登陆页面,使用get方式将要请求的页面带在url后面,key值为next,value值为要请求的页面。如果cookies符合的话就直接返回请求不进行处理。
def login_required(fn):
def inner(request, *args, **kwargs):
if not request.COOKIES.get('is_login') == '1':
next = request.path_info
return redirect('/login/?next={}'.format(next))
ret = fn(request, *args, **kwargs)
return ret
return inner
2、登陆函数
如果请求是POST且账号密码正确,则获取next要访问的地址,如果next不存在则自定义一个访问地址,然后设置cookie的key和value,还可以设置有效期,最后重定向到next的地址。
如果请求不是POST或账号密码错误,则直接返回登陆页面。
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'wangxiaoyu' and pwd == '123456':
next = request.GET.get('next')
if next:
ret = redirect(next)
else:
ret = redirect('/index/')
ret.set_cookie('is_login', '1', max_age=5)
return ret
return render(request, 'login.html')
3、登出函数,删除cookie值
def logout(request):
ret = redirect('/login/')
ret.delete_cookie('is_login')
return ret
四、Session装饰器和登陆函数示例
1、装饰器
def login_required(fn):
def inner(request, *args, **kwargs):
if not request.session.get('is_login') == '1':
next = request.path_info
return redirect('/login/?next={}'.format(next))
ret = fn(request, *args, **kwargs)
return ret
return inner
2、登陆函数
def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'wangxiaoyu' and pwd == '123456':
next = request.GET.get('next')
if next:
ret = redirect(next)
else:
ret = redirect('/index/')
request.session['is_login']='1'
#设置Session和Cookie的超时时间
#如果value值是整数,session会在这些秒数后失效
#如果value值是0,用户关闭浏览器session就会失效
#如果value是None,session会依赖全局session失效策略,默认超时时间是2周
request.session.set_expiry(0)
return ret
return render(request, 'login.html')
3、登出函数
def logout(request):
#request.session.delete() #删除当前会话服务器上的session
# 删除当前会话的session并删除浏览器上会话的cookie
#用于确保当前会话数据不可以再次被用户浏览器访问
request.session.flush()
ret = redirect('/login/')
#ret.delete_cookie('is_login') #删除指定cookie
return ret
4、数据库
session默认使用django自带的文件数据库,用命令python manage.py migrate 创建默认的表。
浏览器会设置一个sessionid的cookies,使用这个作为session_key,到服务器中获取session_data
Session是服务器生成的,存储在服务器端的。
1、服务器第一次响应浏览器请求时,会生成一个sessionid,返回给浏览器;
2、浏览器再次请求时,会带上cookie中的sessionid,服务器通过查询seesionid,在数据库中查询是哪个用户,取出信息,返回给浏览器;
3、Django就通过cookie和session机制完成了自动登录。
参考:https://www.cnblogs.com/maple-shaw/articles/9502602.html
https://blog.csdn.net/real_Rickys/article/details/82831376