session

2.django中session语法

关键部分

1、设置Sessions值
      request.session['session_name'] ="admin"

2、获取Sessions值
      session_name = request.session["session_name"]
      session_name = request.session.get("session_name")

3、删除Sessions值
      del request.session["session_name"]

4、flush()
      删除当前的会话数据并删除会话的Cookie。
      这用于确保前面的会话数据不可以再次被用户的浏览器访问
      request.session.flush()

其他方法

5、get(key, default=None)
    fav_color = request.session.get('fav_color', 'red')

6、pop(key)
    fav_color = request.session.pop('fav_color')

7、keys()
    print(request.session.keys())
    # dict_keys(['is_login', 'username', 'login_time'])

8、items()
    print(request.session.items())
    # dict_items([('is_login', True), ('username', 'lingting'), ('login_time', '2018-08-13 00:19:04')])

9、setdefault()
    request.session.setdefault("setdefault", "my setdefault")
    print(request.session.get("setdefault"))
    # my setdefault


10  得到当前用户session的随机字符串
    request.session.session_key

    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()

    # 检查 用户session的随机字符串 在数据库中是否
    request.session.exists("session_key")

    # 删除当前用户的所有Session数据
    request.session.delete("session_key")

    # session失效策略
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。

session配置
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

配置settings.py 例如:添加如下信息(按项目要求添加)

# 引擎(默认)
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'

# Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_NAME = "sessionid"

# Session的cookie保存的路径(默认)就是有效路径
    SESSION_COOKIE_PATH = "/"

# Session的cookie保存的域名(默认)有效域名
    SESSION_COOKIE_DOMAIN = None

# 是否Https传输cookie(默认)
    SESSION_COOKIE_SECURE = False

# 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_HTTPONLY = True

# Session的cookie失效日期,按照秒算(2周)(默认)
    SESSION_COOKIE_AGE = 1209600

# 是否关闭浏览器使得Session过期(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False

# 是否每次请求都保存Session,默认修改之后才保存(默认)
    SESSION_SAVE_EVERY_REQUEST = False
    例如:登录之后,访问其他该服务器端口的其他页面
    设置了   SESSION_COOKIE_AGE = 10,10秒后失效
    又设置了 SESSION_SAVE_EVERY_REQUEST = True
    在10秒之内访问该服务器端口的其他页面,失效时间将会向后面延迟。10秒之后访问则正常失效
    应用场景:用户登录了以后,连续7天之内访问可以不用登录,一旦间隔7天之后才访问,必须登录!



3.案例学习,用户登录,注销

app01/models.py

from django.db import models

# Create your models here.

class UserInfo(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    pwd = models.CharField(max_length=32)
    email = models.EmailField()
    tel = models.CharField(max_length=32)

项目/urls.py

from django.urls import path
from app01 import views

urlpatterns = [
    path('login/', views.login_session),
    path('index/', views.index_session),
    path('logout/', views.logout_session),
]

app01/views.py

from django.shortcuts import render,HttpResponse,redirect
from app01.myforms import UserForm
from app01.models import UserInfo

# 登录
def login_session(request):
    if request.method == "POST":
        user = request.POST.get("name")
        pwd = request.POST.get("pwd")

        user = UserInfo.objects.filter(name=user, pwd=pwd)
        if user: # 查询成功,设置session
            request.session["is_login"] = True
            request.session['username'] = user[0].name

            # 案例,打印上次登录时间
            import datetime
            now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            request.session['login_time'] = now
            """ 
执行了如下步骤(模拟数据)
1. if request.COOKIE.get("sessionid"): 不生成随机字符串,使用当前的sessionid
   else:生成随机字符串 '52f8notfi1id443s1bhsj58p831mqv3x'
2. response.set_cookie("sessionid","52f8notfi1id443s1bhsj58p831mqv3x")
3. 在djiango-session表中创建一条记录:
    session_key | session_data                                    | expire_date
    ...         | 序列化的{"is_login":True, "username":"lingting"} | 2018-08-26 11:34:32.542111
            """
        return HttpResponse("OK")
    else:
        return render(request,"login.html",locals())

# 访问index
def index_session(request):
    is_login = request.session["is_login"]
    username = request.session.get("username")
    """ 
执行步骤如下模拟:
    1. request.COOKIE.get("sessionid") # "52f8notfi1id443s1bhsj58p831mqv3x"
    2. 在django-session中过滤记录
         session_key                       | session_data                                    | expire_date
       > 52f8notfi1id443s1bhsj58p831mqv3x  | 序列化的{"is_login":True, "username":"lingting"} | 2018-08-26 11:34:32.542111
       obj = django-session.objects.filter(session-key="52f8notfi1id443s1bhsj58p831mqv3x")
    3. is_login = obj.session_data["username"]
       username = obj.session_data.get("username")

删除session键值操作
    del request.session["key"] 
    
删除当前的会话数据并删除会话的Cookie。
这用于确保前面的会话数据不可以再次被用户的浏览器访问
相当于注销功能
    request.session.flush() 
        
        
    """
    print("is_login: ", is_login)
    print("username: ", username)
    print("session_key:", request.session.session_key)

    # 案例,打印上次登录,访问时间
    last_login_time = request.session.get('login_time')

    import datetime
    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    last_visit_time = request.session.get("last_visit_time")
    request.session['last_visit_time'] = now

    return render(request,"index.html",locals())


# 注销功能
def logout_session(request):
    # del request.session["is_login"] 不建议用这种方式
    request.session.flush()
    """删除当前的会话数据并删除会话的Cookie。执行步骤如下伪代码
    1. 获取sessionid
        random_str = request.COOKIE.get("sessionid")
    2. 删除记录
        django-session.objects.filer(session_key=random_str).delete()
    3. 清空对应的cookie
        response.delete_cookie("sessionid", random_str)
    
    """
    return redirect("/login/")

templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
    <div class="container">
        <div class="row" style="padding: 0 18%;margin-top:50px;">
            <form action="" method="post">
                {% csrf_token %}
              <div class="form-group">
                <label for="user">用户名</label>
                <input type="text" class="form-control" id="user" placeholder="用户名" name="name">
              </div>
              <div class="form-group">
                <label for="Password">密码</label>
                <input type="password" class="form-control" id="Password" placeholder="密码" name="pwd">
              </div>
              <button type="submit" class="btn btn-default">提交</button>
            </form>
        </div>
    </div>
</body>
</html>

templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<div class="container">
    <div class="row">
        <a href="/logout/" class="pull-right">注销</a>
    </div>
    <div class="row text-center">
        <h1>hi,{{ username }}</h1>
        <h2>上次登录时间:{{ last_login_time }}</h2>
        <h2>上次访问时间:{{ last_visit_time }}</h2>
        <h2>本次跟新时间:{{ now }}</h2>
    </div>
</div>
</body>
</html>

4.Cookie session总结

总结,关键的5条

Cookie

1. 设置Cookie
    response.set_cookie(key, value)

2. 读取Cookie
    request.COOKIE.get(key)

3. 删除Cookie
    response.delete_cookie(key, ...)

session

1. 设置session
    request.session[key] = value 注意django对应的操作
    
2. 读取session
    value = request.session[key]

3. 删除/注销session
    del request.session["key"]
    request.session.flush()
posted @ 2018-08-13 00:45  哈哈大圣  阅读(337)  评论(0编辑  收藏  举报