Django进阶 Session框架

会话机制

HTTP 协议是无状态的。服务器无法根据 HTTP 协议来辨别 HTTP 请求来自哪个用户,引入会话机制来保存用户的状态。

客户端向服务器发送 HTTP 请求,服务器接收到请求后,生成一个 session 对象,并将 sessionID 以 cookie 的方式返回给客户端,客户端把 sessionID 存储在 cookie 中。客户端之后发起的请求,sessionID 会附在 HTTP 请求头上,发送给服务器。服务器接收到请求后,根据 sessionID 来辨别用户。

服务器端存储 session 数据并提供 cookie 的发送和接收。Cookie 包含会话ID,而不是数据本身。

INSTALLED_APPS = [
    'django.contrib.sessions',        # 启用 sessions 应用
]

MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',        # 启用中间件
]

django/conf/global_settings.py 文件的 SESSIONS 配置项:

SESSION_CACHE_ALIAS = 'default'
SESSION_COOKIE_NAME = 'sessionid'
SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2
SESSION_COOKIE_DOMAIN = None
SESSION_COOKIE_SECURE = False
SESSION_COOKIE_PATH = '/'
SESSION_COOKIE_HTTPONLY = True
SESSION_COOKIE_SAMESITE = 'Lax'
SESSION_SAVE_EVERY_REQUEST = False
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
SESSION_ENGINE = 'django.contrib.sessions.backends.db'
SESSION_FILE_PATH = None
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'

配置会话引擎

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

Django 默认在数据库中存储会话数据(使用模型 django.contrib.sessions.models.Session)。

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

会话数据将直接存储在缓存中。但是,会话数据可能不是持久的。如果缓存已满或缓存服务器重新启动,缓存数据就会丢失。

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

会话数据是持久的,同时写入缓存和数据库。会话数据先从缓存中读取,缓存没有就从数据库中读取。

4. SESSION_ENGINE = 'django.contrib.sessions.backends.file'

SESSION_FILE_PATH 默认为输出tempfile.gettempdir()

5. SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'

会话数据将使用 Django 的工具进行存储,以进行加密签名和 SECRET_KEY 设置。

在视图中使用会话

request.session['user'] = 'abc'    # 设置键值对{'user': 'abc'}
request.session.setdefault('pwd', '123')     # 设置键值对{'pwd': '123'}, 如果存在则不设置
request.session.session_key    # session的随机字符串
request.session.set_expiry()    # 设置session到期时间

user = request.session['user']    # 获取'user'的值
pwd = request.session.get('pwd', None)    # 获取'pwd'的值, 如果不存在则返回None
request.session.exists(session_key)    # 检查session_key是否存在
keys = request.session.keys()    # dict_keys(['user', 'pwd'])
values = request.session.values()    # dict_values(['abc', '123'])
items = request.session.items()    # dict_items([('user', 'abc'), ('pwd', '123')])

request.session.delete()    # 删除当前的session, 不删除cookie
request.session.flush()    # 删除当前的session, 删除cookie
request.session.clear()    # 删除所有的session
request.session.clear_expired()    # 删除所有过期的session

 

转载于:https://www.cnblogs.com/yutb/p/10735475.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值