-
Session
如果不涉及用户登录等敏感信息时,Cookie 能够满足大部分的场景需求。而客户端(如浏览器)会将 Cookie 是保存在硬盘中。如果用户登录敏感信息保存到 cookie 中,会存在安全性问题。因为当 HTTP 请求被黑客拦截,然后劫持 cookie 信息。黑客就可以凭借该 cookie 登录对应的网站。
Session 的出现很好地解决的这个问题。Session 机制是一个服务器端的机制。它会将信息保存服务器端,跟客户端通信只需要一个随机的字符串 session_id。如果客户端没有禁止 Cookie 功能,session_id 通常是保存在 Cookie中 的。
-
Django中session的简单实现
django 的session存储可以利用中间件middleware来实现。B/S架构中,mvc模式下服务器中间件的执行过程是。
INSTALLED_APPS = [
# 启用 sessions 应用
'django.contrib.sessions',
]
MIDDLEWARE = [
# 启用 Session 中间层
'django.contrib.sessions.middleware.SessionMiddleware',
]
- Django中session的存储
数据库/缓存/混合存储
SESSION_ENGINE='django.contrib.sessions.backends.db' # 存储到数据库
SESSION_ENGINE='django.contrib.sessions.backends.cache' # 本地缓存
SESSION_ENGINE='django.contrib.sessions.backends.cached_db' # 混合存储,优先从缓存读取数据,没有读取数据库数据
使用Redis做session存储,settings.py添加配置(需要安装django-redis模块)
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"
4.中间件
创建中间件,用于签发token/id等用于session解析及认证。
def my_middleware(get_response):
def middleware(request):
# session 解析相关方法
response = get_response(request)
return response
return middleware
def my_middleware2(get_response):
def middleware(request):
# session 签发token相关方法
response = get_response(request)
return response
return middleware
MIDDLEWARE = [
'users.middleware.my_middleware1', # 添加
'users.middleware.my_middleware1', # 添加
]
- Session操作
request.session['键']=值 # 写session
request.session.get('键',默认值) # 根据键读值
request.session.clear() # 清除所有session,在存储中删除值部分
request.session.flush() # 清除session数据,在存储中删除session的整条数据
del request.session['键'] # 删除session中的指定键及值
request.session.set_expiry(value) # 设置session有效期