SEESION:
SESSION 一般用来‘’保持会话‘’,Session 对象存储特定用户会话所需的属性及配置信息,当页面跳转时,会话不会消失,会话状态仅在支持 cookie 的浏览器中保留。
SEESION COOKIE设计模式(原理):
1、生成随机字符串
2、将随机字符串保存在本地COOKIE 当中
3、在服务器保存 SEESION
4、在SEESION 当中写上 随机字符串对应的 字典内容 --- 键值对
Django SEESION 自动执行上四内容
设置SESSION
request.session['Key'] = Value ( Value 一般是 1 个字典对象 )
获取SESSION
request.session['Key']
或request.session.get('key',None) 推荐用 此方法
获取SESSION所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
删除SESSION
方法1:删除单个
del request.session['Key']
方法2:删除所有
request.session.clear() ,一般注销用户,用这个
它相当于:request.session.delete(request.session.session_key)
方法3:删除所有的Session (超时时间,默认为2周) 一般用作 xxx周内免登录
request.session.set_expiry(value)
该方法优先级大于默认的settings.py 配置
如果value是个整数,session会在些秒数后失效。单位秒
request.session.set_expiry(60*60)
如果value是个datatime或timedelta,session就会在这个时间后失效。
如果value是0,用户关闭浏览器session就会失效。
如果value是None,session会依赖全局session失效策略。
将所有Session失效日期小于当前日期的数据从Django数据库中删除
request.session.clear_expired()
获取SEESION 生成的COOKIE 随机字符串
request.session.session_key
设置SESSION 过期时间
settings.py 模块中设置---新增 ,删除本地信息
SESSION_EXPIRE_AT_BROWSER_CLOSE=True 浏览器关闭时过期(默认(不设置)为Flase)
SESSION_COOKIE_AGE=60 设置固定时间过期 (默认(不设置为)2周,单位为秒)
SESSION 其他配置 通用配置
以下内容需要在settings.py 中新增,且数据为默认值,
SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) 推荐设置True,只要用户有操作,就应该保存,让超时时间为用户最后一次操作时间
SESSION 储存位置 引擎配置
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中
还支持储存在 缓存,文件,等位置。
数据库
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 数据库引擎(默认)
缓存
配置 settings.py
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 缓存引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
文件
SESSION_ENGINE = 'django.contrib.sessions.backends.file'
http://www.cnblogs.com/wupeiqi/articles/5246483.html
使用案例:
from django.shortcuts import render, redirect
#登录
def login(request):
if request.method == 'POST':
username = request.POST['user']
pwd = request.POST['password']
if username == 'lee' and pwd == '123':
request.session['is_login'] = {'username':username}
return redirect('/main/')
else:
ret = {'ret':'用户名密码错误'}
return render(request, 'login.html', ret)
return render(request, 'login.html')
#首页
def main(request):
msg = request.session['is_login']
if msg:
return render(request, 'main.html', {'msg':msg})
else:
return redirect('/login/')
#退出
def logout(request):
del request.session['is_login']
return redirect('/login/')
SESSION 和COOKIE 之间的关系:
- SESSION:一般保存在远程服务器(数据库、内存、缓存)
- COOKIE: 一般保存在本地
- SESSION 默认存在 django_session 数据库表中
- request.session['key']={ 'key1':'value1' } 中的key 为序列化且加密后cookie
- 一般情况下,浏览器禁用 cookie 后,session 也不可用
基于SESSION的用户登录验证:
def session_login(fun): # 定义一个装饰器
def check_session(request, *args, **kwargs):
try:
request.session.get('user_id') # 如果session 中含有 user_id
res = fun(request, *args, **kwargs) # 就允许登录
return res
except Exception as e:
res = HttpResponseRedirect('/user/login') # 否则就跳转到登录页面
res.set_cookie('url',request.get_full_url) # 并记录当前的访问页面到 cookie 当中
return res
return check_session
使用
@session_login
注意:http://127.0.0.1:8000/200/?type=10
request.path : 表示当前路径/200/
request.get_full_path( ) : 表示完整路径/200/?type=10