Session:
- 是服务端的一个键值对
- 内部机制依赖于cookie
1、分类
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
配置方式不同,操作方式相同
2、配置(settings.py)
2.1 数据库Session
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
1 配置 settings.py
2
3 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
4
5 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
6 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)
7 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)
8 SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)
9 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)
10 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
11 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
12 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
13
2.2 缓存Session
1 配置 settings.py
2
3 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
4 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
5
6
7 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
8 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
9 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
10 SESSION_COOKIE_SECURE = False # 是否Https传输cookie
11 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
12 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
13 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
14 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
15
2.3 文件Session
1 配置 settings.py
2
3 SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
4 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
5
6
7 SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
8 SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
9 SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
10 SESSION_COOKIE_SECURE = False # 是否Https传输cookie
11 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
12 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
13 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
14 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
15
2.4 缓存+数据库Session
1 数据库用于做持久化,缓存用于提高效率
2
3 配置 settings.py
4
5 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
6
2.5 加密cookie Session
1 配置 settings.py
2
3 SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
3、使用
1 使用
2
3 def index(request):
4 # 获取、设置、删除Session中数据
5 request.session['k1']
6 request.session.get('k1',None)
7 request.session['k1'] = 123
8 request.session.setdefault('k1',123) # 存在则不设置
9 del request.session['k1']
10
11 # 所有 键、值、键值对
12 request.session.keys()
13 request.session.values()
14 request.session.items()
15 request.session.iterkeys()
16 request.session.itervalues()
17 request.session.iteritems()
18
19
20 # 用户session的随机字符串
21 request.session.session_key
22
23 # 将所有Session失效日期小于当前日期的数据删除
24 request.session.clear_expired()
25
26 # 检查 用户session的随机字符串 在数据库中是否
27 request.session.exists("session_key")
28
29 # 删除当前用户的所有Session数据
30 request.session.delete("session_key")
31
32 request.session.set_expiry(value)
33 * 如果value是个整数,session会在些秒数后失效。
34 * 如果value是个datatime或timedelta,session就会在这个时间后失效。
35 * 如果value是0,用户关闭浏览器session就会失效。
36 * 如果value是None,session会依赖全局session失效策略。
4、扩展:Session用户验证
1 def login(func):
2 def wrap(request, *args, **kwargs):
3 # 如果未登陆,跳转到指定页面
4 if request.path == '/test/':
5 return redirect('http://www.baidu.com')
6 return func(request, *args, **kwargs)
7 return wrap