day22-django session
一、引子
之前我们学习了session的介绍和原理,今天我们来学习一下session在django里面的具体使用,以及session不仅可以存在数据库还可以存在缓存或者文件中等等--我们统称为session 存在服务器端,以及session在settings里面的配置等等,下面我们就来好好学习一下。
二、使用
2.1、获取、设置、删除Session值
说明:获取值,设置,和删除session中的某个session值
1 #获取值 2 request.session["k1"] #如果不存在,会报错,一般用下面的方式 3 request.session.get("k1",None) 4 5 #设置值 6 request.session["user"]="niubi" #没有user就设置,有user,就更新 7 reuqest.session.setdefault("user","niubi") #存在user,就不设置, 如果不存在就设置。 8 9 #删除值 10 11 del request.session["user"]
2.2、所有的键、值、键值对
1 #所有的键,值,键值对 2 3 request.session.keys() 4 5 request.session.values() 6 7 request.session.items() 8 9 request.session.iterkeys() 10 11 request.session.itervaluses() 12 request.session.iteritems()
2.3、用户获取随机字符串
1 request.session.session_key
2.4、将所有session 失效日期小于当前日期的数据删除
说明:把那些超过超时时间的数据全部删除,以后就不用了
1 1 #清除超过超时时间的数据 2 3 4 request.session.clear_expired()
2.5、检查,用户session 的随机字符串,在书库中是否存在
1 request.session.exists("session_key")
2.6、删除当前用户的所有Session数据
说明:这边是删除对应session_key这条数据删除
1 request.session.delete("session_key") 2 3 一般情况不用上面那个,用下面这个 4 5 request.session.clear() #相当于request.session.delete(request.session.session_key) 6 7 那这个一般用于说明地方呐?一般用于你 注销 ,请看下面的示例:
下面搞一个注销的栗子
login 如上回栗子
url index.html
1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="UTF-8"> 5 <title></title> 6 </head> 7 <body> 8 <h1> 欢迎登陆:{{ username }}--{{ request.session.username }}</h1>
#这里后台可以不用传 username ,因为username, 在request 里面包含, 9 <a href="/logout/">注销</a> 10 11 12 </body> 13 </html>
views
1 from django.shortcuts import render,redirect,HttpResponse 2 3 # Create your views here. 4 5 6 7 def login(request): 8 if request.method=="GET": 9 return render(request,"login.html") 10 elif request.method=="POST": 11 user=request.POST.get("user") 12 pwd=request.POST.get("pwd") 13 if user=="root" and pwd =="123": 14 #生成随机字符串 15 #写到浏览器 cookie 16 #保存到session 17 #在随机字符串对应的字典中设置相应的内容 18 request.session["username"]=user 19 request.session["is_login"]=True 20 return redirect("/index/") 21 else: 22 error_msg="用户密码错误" 23 return render(request,"login.html",{"error_msg":error_msg}) 24 25 26 def index(request): 27 if request.session.get("is_login"): 28 username=request.session.get("username") 29 return render(request,"index.html",{"username":username}) 30 else: 31 return redirect("/login/") 32 33 34 def logout(request): 35 request.session.clear() 36 return render(request,"login.html")
2.8、设置超时时间
request.session.set_expiry(value)
url login.html

views


三、配置settings 文件配置session的默认值
之前我们说,django设置的超时时间是2周,那这个是在哪里设置的呐,这边我们就要这setting文件里面去设置session了,下面一起来看看吧!
|
1
2
3
4
5
6
7
8
|
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自动过去
|
1
|
SESSION_EXPIRE_AT_BROWSER_CLOSE = True |
当然在默认情况,如果你设置set_cookie是不设置超时时间的话,关闭浏览器,自动消失,原理跟这个一样的:
|
1
|
set_cookie('k1',123) |
3.2、每次请求保存session
说明:我们之前设置超时时间都是从第一次请求服务器开始算,10s以后超时,但是现在是只要你每次请求一次,超时时间另外计算
|
1
|
SESSION_SAVE_EVERY_REQUEST = True |
如图:

三、配置settings 文件配置session的默认值
之前我们说,django设置的超时时间是2周,那这个是在哪里设置的呐,这边我们就要这setting文件里面去设置session了,下面一起来看看吧!
|
1
2
3
4
5
6
7
8
|
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自动过去
|
1
|
SESSION_EXPIRE_AT_BROWSER_CLOSE = True |
当然在默认情况,如果你设置set_cookie是不设置超时时间的话,关闭浏览器,自动消失,原理跟这个一样的:
|
1
|
set_cookie('k1',123) |
3.2、每次请求保存session
说明:我们之前设置超时时间都是从第一次请求服务器开始算,10s以后超时,但是现在是只要你每次请求一次,超时时间另外计算
|
1
|
SESSION_SAVE_EVERY_REQUEST = True |
如图:

四、django支持session的类型
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
4.1、数据库Session
|
1
2
3
4
5
|
jango默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) |
4.2、缓存Session
说明:cache默认只支持memcached,不支持redis
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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
|
1
2
3
4
|
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
说明:先从缓存中去拿,拿不到就从数据库里面去拿
|
1
2
3
4
5
|
数据库用于做持久化,缓存用于提高效率 a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 |
4.5、加密cookie Session
说明:跟cookie已经没有区别了,用的就是cookie
|
1
2
3
|
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 |
扩展:Session用户验证
|
1
2
3
4
5
6
7
|
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 |

浙公网安备 33010602011771号