文章目录
- 1.session流程图
- 2.session语法与案例
- 3.session配置
cookie
不安全,会把所有敏感数据放到浏览器保存。
session
是把敏感数据存到自己的服务器中给浏览器一把钥匙就行了(是基于cookie
完成的)。
Django 提供对匿名会话(session
)的完全支持。这个会话框架让你可以存储和取回每个站点访客任意数据。它在服务器端存储数据, 并以cookies
的形式进行发送和接受数据。
1.session流程图
-
创建一把随机字符串 钥匙。
-
把随机字符串和请求数据键值对组成的数据 放到
django-session
表里去 (绿色部分都是django的中间件实现的)。 -
将钥匙按照cookie方式传给浏览器(浏览器只保留钥匙)。
2.session语法与案例
# 1、设置Sessions值
request.session['session_name'] ="admin"
# 2、获取Sessions值
session_name = request.session["session_name"]
# 3、删除Sessions值
del request.session["session_name"]
# 4、flush()
# 删除当前的会话数据并删除会话的Cookie。这用于确保前面的会话数据不可以再次被用户的浏览器访问
def s_login(request):
if request.method == "GET":
return render(request, "login.html")
else:
user = request.POST.get("user")
pwd = request.POST.get("pwd")
try:
user_obj = User.objects.get(user=user,pwd=pwd)
# 写session
# 1、中间件会自己创建随机字符
# 2、将随机字符串作为session-key 将session作为session-data 插入到djang-session表中(自带的)
# 3、session_id和随机字符串组成键值作为cookie返回客户端
request.session["is_login"] = True
request.session["username"] = user_obj.user
return redirect("/s_index/")
except:
return redirect("/s_login/")
def s_index(request):
# 读session
# 1、去session_id的钥匙
# 2、去django-session表中查询符合条件的记录
# 3、将取出的session-data.get('is_login')
is_login = request.session.get("is_login")
if is_login:
# 登录成功过
username = request.session.get("username")
return render(request, "index.html", {"user": username})
else:
# 登录没成功
return redirect("/s_login/")
'''
shop.html:
<p>
客户端最后一次访问时间:{{ last_time|default:"第一次访问" }}
</p>
<h3>商品页面</h3>
'''
def shop(request):
last_time = request.session.get("last_time")
now = datetime.datetime.now().strftime("%Y-%m-%d %X")
request.session["last_time"] = now
return render(request, "shop.html", {"last_time": last_time})
# 退出登录 删除session
def s_logout(request):
# 暴力删除会删除整条记录 访问时间也没有了
# request.session.flush()
# del比较友好 只删除指定的数据删除
del request.session["username"]
del request.session["is_login"]
return redirect("/s_login/")
session 在服务器端,cookie 在客户端(浏览器)
session 默认被存在在服务器的一个数据库(不是内存)
session 的运行依赖 session id,而 session id 是存在 cookie 中的.
session 可以放在 文件、数据库、或内存中都可以。
用户验证这种场合一般会用 session
3.session配置
# Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
# 配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)