session运行机制
- 客户第一次访问某服务器,服务器发送sessionID给客户端,并且在服务器创建与sessionID对应的文件存储信息(每个客户端对应唯一的sesionID)。
- 客户第二次访问该服务器时,sessionID会随着request请求一起发送到服务端,服务端识别该sessionID,并处理对应的客户端信息。
session在django的实现
- 在终端命令行输入:python3 manage.py migrate
运行django数据库django_session,这样,用户登录的时候服务器才能记录相应的session - session设置
request.session[‘key’] = value - 获取session
value = request.session[‘key’]
value = request.session.get[‘key’] - 删除session的值
del request.session[‘key’] - 在settings.py中设置session的设置
SESSION_COOKIE_AGE = 606024*7
作用:设置session在cookie中的保存时间,以s为单位
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
作用:设置session在浏览器关闭时清空浏览器上的session空间
cookie与session在登录界面的完整实现
from django.shortcuts import render,redirect
from django.http import HttpResponse
# Create your views here.
def login_views(request):
if request.method == "GET":
# 获取请求源地址,如果没有源地址则设置为'/'
url = request.META.get('HTTP_REFERER','/')
#判断用户session是否存在
#如果存在,则直接返回原来的地址
if 'uid' in request.session and 'uname' in request.session:
resp = redirect(url)
return resp
# 不存在则判断cookie中用户信息是否存在
else:
#如果存在,则取出用户信息存进session,然后返回原来的地址
if 'uid' in request.COOKIES and 'uname' in request.COOKIES:
uid = request.COOKIES['uid']
uname = request.COOKIES['uname']
request.session['uid'] = uid
request.session['uname'] = uname
resp = redirect(url)
return resp
#cookie不存在则返回登录界面并将原地址存入cookie
else:
resp = render(request,'login.html',locals())
resp.set_cookie('url',url)
return resp
# 如果请求方式是post
else:
uname = request.POST['uname']
upwd = request.POST['upwd']
users = User.objects.filter(uname=uname,upwd=upwd)
#判断登录信息在数据库是否存在,如果存在存入session,否则返回登录界面继续登录
if users:
request.session['uid'] = users[0].id
request.session['uname'] = uname
# 取出cookie中的原地址
url = request.COOKIES.get('url','/')
resp = redirect(url)
# 删除cookie中的原地址
if url in request.COOKIES:
resp.delete_cookie('url')
#如果需要记住密码,存入cookie
if 'isSaved' in request.POST:
expire = 60*60*24*30
resp.set_cookie('uid',users[0].id,expire)
resp.set_cookie('uname',uname,expire)
# 返回原地址
return resp
else:
return render(request,'login.html',locals())