1.Session的由来:
Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。
Session依赖于Cookie而存在。(浏览器是通过cookie到服务器端作为唯一标识进而获取相应的session,在服务器中的数据库表中存储的每个用户的session都对应着一个cookie)
request.session是一个对象。
2.Django中session的方法。
1.设置session
request.session["k1"] = "vaule1"
request.session.setdefault('k1',123) # 存在则不设置
2.获取session
request.session['k1']
request.session.get('k1',None)
3.删除session中的数据
del request.session['k1']
# 删除当前会话的所有Session数据
request.session.delete()
# 删除当前的会话数据并删除会话的Cookie。
request.session.flush()
将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
4.设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。(默认是2周)
5.会话session的key
# 会话session的key
request.session.session_key
# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")
3.Session流程解析:

4.settins.py中的设置
设置Session的cookie在浏览器上的显示,设置后浏览器上的session所对应的cookie键为“xiaohei”(一般不设置)
# SESSION_COOKIE_NAME = "xiaohei"
有操作时即时更新session设置的超时时间,让计时是从此刻开始。(一般设置)
SESSION_SAVE_EVERY_REQUEST = True
5.session版登录验证
1 from functools import wraps 2 3 def check_login(func): 4 @wraps(func) 5 def inner(request, *args, **kwargs): 6 next_url = request.get_full_path() 7 if request.session.get("user"): 8 return func(request, *args, **kwargs) 9 else: 10 return redirect("/login/?next={}".format(next_url)) 11 return inner 12 13 def login(request): 14 if request.method == "POST": 15 user = request.POST.get("user") 16 pwd = request.POST.get("pwd") 17 18 if user == "alex" and pwd == "alex1234": 19 # 设置session 20 request.session["user"] = user 21 # 获取跳到登陆页面之前的URL 22 next_url = request.GET.get("next") 23 # 如果有,就跳转回登陆之前的URL 24 if next_url: 25 return redirect(next_url) 26 # 否则默认跳转到index页面 27 else: 28 return redirect("/index/") 29 return render(request, "login.html") 30 31 @check_login 32 def logout(request): 33 # 删除所有当前请求相关的session 34 request.session.delete() 35 return redirect("/login/") 36 37 @check_login 38 def index(request): 39 current_user = request.session.get("user", None) 40 return render(request, "index.html", {"user": current_user})