会话机制
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