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

 

posted @ 2018-04-11 16:13  帅丶高高  阅读(153)  评论(0编辑  收藏  举报