session

1.概念:

  • 保存在服务器的数据叫做 session
  • session需要依赖于cookie

2. Django中开启session

可以在settings.py文件中查看,如图所示

如需禁用session,将上图中的session中间件注释掉即可。

3 session存储方式

在settings.py文件中,可以设置session数据的存储方式,可以保存在数据库、本地缓存等。

2.1 数据库

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式。

SESSION_ENGINE='django.contrib.sessions.backends.db'

如果存储在数据库中,需要在项INSTALLED_APPS中安装Session应用。

数据库中的表如图所示

表结构如下

说明:由表结构可知,操作Session包括三个数据:键,值,过期时间。

2.2 本地缓存

存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。

SESSION_ENGINE='django.contrib.sessions.backends.cache'

2.3 混合存储

优先从本机内存中存取,如果没有则从数据库中存取。

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

2.4 Redis

在redis中保存session,需要引入第三方扩展,我们可以使用django-redis来解决。

1) 安装扩展

pip install django-redis

2)配置

在settings.py文件中做如下设置

CACHES = {
    'default': {
        'BACKEND': 'django_redis.cache.RedisCache',
        'LOCATION': 'redis://127.0.0.1:6379/1',
        'OPTIONS': {
            'CLIENT_CLASS': 'django_redis.client.DefaultClient',
        }
    }
}
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
SESSION_CACHE_ALIAS = 'default'

注意: 如果redis的ip地址不是本地回环127.0.0.1,而是其他地址,访问Django时,可能出现Redis连接错误,如下:

解决方法:

  1. 修改redis的配置文件,添加特定ip地址。
  2. 打开redis的配置文件,并添加绑定的ip
    sudo vim /etc/redis/redis.conf

    3. 

  3. 重新启动redis服务

     sudo service redis-server restart 

 

4. session流程:

第一次请求:
① 第一次请求的时候 cookie中没有任何信息
② 当服务器接收到这个请求之后,设置session信息
③ 在设置session信息的时候,session信息保存在服务器端, 同时服务器会在响应头中设置一个 sessionid 的cookie信息(由服务器自己设置的,不是我们设置的)
④ 客户端(浏览器)在接收到响应之后,会将cookie信息保存起来(保存 sessionid的信息)

第二次及其之后的请求:
⑤ 第二次及其之后的请求都会携带包含session id的cookie信息
⑥ 当服务器接收到这个请求之后,会获取到sessionid信息,然后进行验证,验证成功,则可以获取 session信息(session信息保存在服务器端)

5.示例:

1.第一次请求,设置session:

def set_session(request):

    """
     第一次请求:
            ① 我们第一次请求的时候可以携带一些信息(用户名/密码) cookie中没有任何信息
            ② 当我们的服务器接收到这个请求之后,进行用户名和密码的验证,验证没有问题可以设置session
                信息
            ③ 在设置session信息的同时(session信息保存在服务器端).服务器会在响应头中设置一个 sessionid 的cookie信息
            ④ 客户端(浏览器)在接收到响应之后,会将cookie信息保存起来(保存 sessionid的信息)

    """
    # 1.cookie中没有任何信息
    print(request.COOKIES)  # {}

    #2. 如果是登录页面请求,携带用户名密码,则对用户名和密码进行验证
    # 假设认为 用户名和密码正确
    user_id=6666

    #3.设置session信息
    # request.session  理解为字典
    # 设置session的时候其实 session做了2件事
    #第一件: 将数据保存在数据库中
    #第二件: 设置一个以sessionid为key的cookie信息
    request.session['user_id']=user_id

    #4. 返回响应
    return HttpResponse('set_session')

 

查看浏览器端的cookie可以看到:

 

2.第二次及后面的请求,获取session

def get_session(request):

    """


        第二次及其之后的请求:
            ⑤ 第二次及其之后的请求都会携带 session id信息
            ⑥ 当服务器接收到这个请求之后,会获取到sessionid信息,然后进行验证,
                验证成功,则可以获取 session信息(session信息保存在服务器端)

    """
    #1. 请求都会携带 session id信息
    print(request.COOKIES)

    #2. 会获取到sessionid信息,然后进行验证,
    # 验证成功,可以获取 session信息(

    # request.session 字典
    user_id=request.session['user_id']
    user_id=request.session.get('user_id')

    #

    #3.返回响应
    return HttpResponse('get_session')

6. Session操作汇总

通过HttpRequest对象的session属性进行会话的读写操作。

1) 以键值对的格式写session。

request.session['键']=值

2)根据键读取值。

request.session.get('键',默认值)

3)清除所有session,在存储中删除值部分。

request.session.clear()

4)清除session数据,在存储中删除session的整条数据。

request.session.flush()

5)删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']

6)设置session的有效期

request.session.set_expiry(value)
  • 如果value是一个整数,session将在value秒没有活动后过期。
  • 如果value为0,那么用户session的Cookie将在用户的浏览器关闭时过期。
  • 如果value为None,那么session有效期将采用系统默认值, 默认为两周,可以通过在settings.py中设置SESSION_COOKIE_AGE来设置全局默认值。

 

posted @ 2021-01-18 22:00  foreast  阅读(110)  评论(0编辑  收藏  举报