写在前言:
cookies虽然也能完成认证工作,但是cookies是保存在浏览器端数据,所以这就导致这种操作有极强的不安全性。并且通常认证操作的话,需要在cookies中写数据,这就避免不了要写一些敏感的信息。
这样直接就造成了cookies存放数据的不安全性。因此:我们想若是把数据放在服务器端,仅是给客户端cookies写入简单的但足以明确标志的信息,就避免了不安全的问题。
所以就有了session这个东东,此处就跟大家谈谈session。
session(django自带的操作机制)
Cookie是什么?
保存在客户端浏览器上的键值对
缺点:会暴露敏感信息!
Session是什么?
是保存在服务器端的数据(类型不确定)<本质是键值对>
应用:依赖于cookie
作用:保持会话(Web网站)记录登录状态,用来做信息检测!
好处:敏感信息不会直接给客户端
PS:在执行语句,创建数据库的过程中,会初始化创建一个叫做django_session的表,用以存放
创建的键值对(已经过加密处理)。也就是说session数据的增,删,查都是通过这张表来操作。
实质:每个用户来访问服务器都会给客户分配一个ID。用户请求访问,服务器端就会将这个访问保存成一份ID唯一的数据(这份数据对应一个独一无二的ID),
这个ID,服务器会通过set cookie 的方式告诉给客户端。然后客户端请求的时候会把这个ID带上,服务端的session就可以和客户端关联起来了。
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
1、数据库(默认)
2、缓存
3、文件
4、缓存+数据库
5、加密cookie
- session操作:
# 获取、设置、删除Session中数据
request.session['k1'] #创建
request.session.get('k1',None) #获取,没值返回none
request.session['k1'] = 123 #设置值,不管k1是否有值,都会设置
request.session.setdefault('k1',123) # 设置k1,存在则不设置
del request.session['k1'] #删除session随机字符串对应的值,随机字符串还在。
# 所有键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 用户session的随机字符串(django自动生成的随机字符串)
session_key = request.session.session_key
# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()
# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")
# 删除当前用户的所有Session数据,直接将session数据<随机字符串及对应的值>删除
request.session.delete("session_key")
request.session.set_expiry(value) #设置失效时间,以秒为单位。
* 如果value是个整数,session会在些秒数后失效。
* 如果value是个datatime或timedelta,session就会在这个时间后失效。
* 如果value是0,用户关闭浏览器session就会失效。
* 如果value是None,session会依赖全局session失效策略。
- 在settings.py文件中配置session:-------> 需要更改某个配置的话,就直接在配置文件中写这条配置信息即可。
- 数据库:
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
配置:
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
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 = True # 是否每次请求都保存Session,默认修改之后才保存(默认)
#False,表示不保存多次请求的session,只以第一次访问是的session为准,再超过最长存在时间之后失效。
#True,只要是在失效时间之内,每次发起请求,服务端都会刷新保存当前创建的session,失效时间重新计算。
- 缓存:
配置:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
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,默认修改之后才保存
- 文件:
配置:
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
# 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
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,默认修改之后才保存
- 缓存+数据库:
数据库用于做持久化,缓存用于提高效率
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
- 加密cookie:
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
梳理:
1. 保存在服务端的数据(本质是键值对)
2. 配置文件中:
- 存储位置
- 超时时间、每次刷新更新时间
3. request.session
- 增加
可以添加单个值,也可以写成一个字典。
request.session["username"]="xxx";
request.session["userinfo"]={"username":"xxx","sex"="male",...}
- 获取随机字符串对应的内容
v = request.session.get("userinfo");
- 主动设置超时时间 ***