day21-session
一、前言
之前我们学习了session的介绍和原理,今天我们来学习一下session在django里面的具体使用,以及session不仅可以存在数据库还可以存在缓存或者文件中等等,已经session在settings里面的配置等等,下面我们就来好好学习一下。
二、使用
2.1、获取、设置、删除Session值
说明:获取值,设置,和删除session中的某个session值
#获取值 request.session['k1'] request.session.get('k1',None) #设置值 request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 #删除值 del request.session['k1']
2.2、所有的键、值、键值对
# 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems()
2.3、用户随机字符串
request.session.session_key
2.4、将所有Session失效日期小于当前日期的数据删除
说明:把那些超过超时时间的数据全部删除掉,以后就不用了
request.session.clear_expired()
2.5、检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")
2.6、删除当前用户的所有Session数据
说明:这边是删除对应session_key这条数据删除
request.session.delete("session_key")
一般情况下不用这个,一般用这个:
request.session.clear() #相当于 request.session.delete(request.session.session_key)
那这个一般用于说明地方呐?一般用于你 注销 ,请看下面的示例:
1、url.py代码:
说明:这边登录的代码就不写了,如果想看登录的话,就请看上一篇博客
from django.urls import path from app01 import views urlpatterns = [ path('logout/', views.logout), path('index/', views.index), ]
2、view.py的代码
def index(request): if request.session.get("is_login",None): return render(request,'index.html') #这边已经向前端传入request值了,就不用在render(request,'index.html',{'username':{request.session.get('username')}})这边传值了 else: return HttpResponse('gun') def logout(request): request.session.clear() #清除所有的session记录,就可以直接注销了 return redirect('/login/')
3、templates的index.html页面
<body> <h1>欢迎登录:{{ request.session.username }}</h1> #因为这边前端已经传过来了request,所以用户就直接用{{ request.session.username }}就可以了 <a href="/login/">注销</a> </body>
注意了:因为这边前端已经传过来了request,所以用户就直接用{{ request.session.username }}就可以了
2.7、设置超时时间
说明:我可以设置session的过期时间,django的session默认的超时时间是两周
request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
示例:
后台设置:
三、配置settings 文件配置session的默认值
之前我们说,django设置的超时时间是2周,那这个是在哪里设置的呐,这边我们就要这setting文件里面去设置session了,下面一起来看看吧!
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,默认修改之后才保存(默认)
3.1、关闭浏览器session自动过去
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
当然在默认情况,如果你设置set_cookie是不设置超时时间的话,关闭浏览器,自动消失,原理跟这个一样的:
set_cookie('k1',123)
3.2、每次请求保存session
说明:我们之前设置超时时间都是从第一次请求服务器开始算,10s以后超时,但是现在是只要你每次请求一次,超时时间另外计算
SESSION_SAVE_EVERY_REQUEST = True
如图:
四、django支持session的类型
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
4.1、数据库Session
jango默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
4.2、缓存Session
说明:cache默认只支持memcached,不支持redis
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 CACHES = { 'default': { # 缓存的别名default 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] }, 'db01': { # 缓存的别名db01 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] }, }
4.3、文件Session
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 比如 SESSION_FILE_PATH = (BASE_DIR,'cache')
4.4、缓存+数据库Session
说明:先从缓存中去拿,拿不到就从数据库里面去拿
数据库用于做持久化,缓存用于提高效率 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
4.5、加密cookie Session
说明:跟cookie已经没有区别了,用的就是cookie
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
扩展:Session用户验证
def login(func): def wrap(request, *args, **kwargs): # 如果未登陆,跳转到指定页面 if request.path == '/test/': return redirect('http://www.baidu.com') return func(request, *args, **kwargs) return wrap