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

 

posted @ 2018-07-23 14:53  东郭仔  阅读(98)  评论(0)    收藏  举报