【Django框架】——25 Django视图 07 状态保持Session

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

在这里插入图片描述

在这里插入图片描述

文章目录


cookie不安全会把所有敏感数据放到浏览器保存。

session是把敏感数据存到自己的服务器中给浏览器一把钥匙就行了是基于cookie完成的。

Django 提供对匿名会话(session)的完全支持。这个会话框架让你可以存储和取回每个站点访客任意数据。它在服务器端存储数据, 并以cookies的形式进行发送和接受数据。

1.session流程图

  • 创建一把随机字符串 钥匙。

  • 把随机字符串和请求数据键值对组成的数据 放到django-session表里去 绿色部分都是django的中间件实现的。

  • 将钥匙按照cookie方式传给浏览器浏览器只保留钥匙。

image.png

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默认修改之后才保存默认
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go