Session

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})
 
 
 
原文地址:https://www.cnblogs.com/aberwang/p/10403961.html