[Django Framework] - 25 Django View 07 State Keeping Session

insert image description here

insert image description here


cookieIt is not safe, and all sensitive data will be stored in the browser.

sessionJust store sensitive data in your own server and give the browser a key (based on cookiecompletion).

Django provides sessionfull support for anonymous sessions ( ). This session framework lets you store and retrieve arbitrary data per site visitor. It stores data on the server side, and cookiessends and receives data in the form of .

1.session flow chart

  • Create a random string key.

  • Put the data composed of random strings and request data key-value pairs into django-sessionthe table (the green part is implemented by django middleware).

  • Pass the key to the browser as a cookie (the browser only keeps the key).

image.png

2.session grammar and case

# 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 configuration

# 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,默认修改之后才保存(默认)

Guess you like

Origin blog.csdn.net/m0_68744965/article/details/127739134