Django之session详解与实战示例(其他篇五)

上一篇:Django之分页(其他篇四)点击跳转
下一篇:Django之缓存六种方式及实战示例(其他篇六)点击跳转

目录


session介绍

讲到session那么我们就必须先回顾cookie,因为session是需要依赖cookie的,我们都知道如果基于cookie进行访问的话,敏感的信息就会泄露,不符合安全问题所以session就是为了解决这个问题,同时session也是提高访问性能.

Session原理:
    1.Cookie是保存在用户浏览器端的键值对(就是字典)
    2.Session是保存在服务器端的键值对(就是字典)
    3.Session依赖于cookie

Session生命周期

1. Burgess第一次登录成功了
2.后台就把Burgess该用户的一些常用的信息存放在session(内存)如下:

    session = {
        #(Burgess用户)
        随机生成字符串(如:aaaaa):{
                ‘is_login’:True,
                ‘user’:’Burgess’,
                ‘nid’:’....’,
                    ......
      }
      #(Cristal用户)
      随机生成字符串(如:bbbbb):{
               ‘is_login’:True,
               ‘user’:’Cristal’,
               ‘nid’:’....’,
               .....
      }
}

3.然后把随机字符串aaaaa  or  bbbbb给对应的用户.
4.下次登录会带着这个随机字符串aaaaa  or  bbbbb
5.sesstion根据这个随机字符串aaaaa  or  bbbbb进行匹配然后从对应的字典,在拿到相关的信息

所有用户相关的信息用户客户端的没有的,只有一个随机字符串
而服务端维护的就是用户的相关信息(就是一个大的字典,随机字符串为key)

如果你要用session来做这件事,就非常简单了
如果自己手写,就自己写个随机字符串给用户,生成字典,要把随机字符串写进用户的cookie..
但是在django已经帮你完成了所有的操作

Django提供了5种类型的Session

分别为: 数据库(默认)、 缓存、文件、缓存+数据库、加密cookie

    1、数据库Session

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。
        a. 配置 settings.py(配置一些sessiton的默认值) 

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 = False                      
    # 是否每次请求都保存Session,默认修改之后才保存(默认)
    # 这个很重要,假如超时时间10秒session失效,其实我们每次对该页面请求或者刷新后,都应该对该超时10秒进行再次推后,也就是,超时时间根据你当前操作后的时间的10秒后才失效,如果期间又有操作,那么超时时间继续根据操作后的当前时为准
    # 应该把这个设置成True

        b. 使用  

def index(request):
    # 获取值
    request.session['k1']#如果客户端的key不存在这种形式会报错
    request.session.get('k1',None) #所以一般使用这种,后面设置个None默认值就不会报错
    
    # 设置值
    request.session['k1'] = 123  #设置用户相关信息
    request.session.setdefault('k1',123)  #存在则不设置
    
    # 删除Session中数据
    del request.session['k1']  #删除掉该key的值
 
    # 所有 键、值、键值对
    request.session.keys()
    request.session.values()
    request.session.items()
    request.session.iterkeys()
    request.session.itervalues()
    request.session.iteritems()
    
    #如for循环
    for k in request.session.keys():
    for v in request.session.valuess():
    for k,v in request.session.items():

    # 用户session的随机字符串
    request.session.session_key
       
    # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
        #作用,默认超时时间保存2周,用户的cookie的随机字符串也是2周,如果用户清除了cookie的随机字符串,服务端还是存在该字符串,用户继续重新登录以后,服务端就出现了2个随机字符串对该用户,前面的一条随机字符串就等于是一条脏数据,如果这条脏数据放在缓存里面如(memched、redis)是没问题的,默认到了超时时间点就自动清除之前的脏数据(系统机制),而数据库就没有该机制,所以使用该命令就等于拿到了该用户所有相关信息,包括之前的随机字符串,根据随机字符串的当前时间时间和超时时间,进行判断:如果当前时间比超时时间大,清除脏数据

    #检查 用户session的随机字符串 在数据库中是否存在
    request.session.exists("session_key")
 
    #删除当前用户的所有Session数据
    request.session.delete("session_key")#应用场景:用户点注销的时候,就删除掉所有用户的session信息
         
    #设置当前用户超时时间(session 和用户cookie的超时时间,默认两周)
    request.session.set_expiry(value)
        #* 如果value是个整数,session会在些秒数后失效。
        #* 如果value是个datatime或timedelta,session就会在这个时间后失效。
        #* 如果value是0,用户关闭浏览器session就会失效。
        #* 如果value是None,session会依赖全局session失效策略。
 

 

    2、缓存Session

        a. 配置 settings.py

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,默认修改之后才保存

        b. 使用
(同数据库session的使用一致)

    3、文件Session

        a. 配置 settings.py
 

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,默认修改之后才保存

        b. 使用
          (同数据库session的使用一致)


    4、缓存+数据库Session(数据库用于做持久化,缓存用于提高效率)

        a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎

        b. 使用
         (同数据库session的使用一致)

    5、加密cookie Session

        a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎

        b. 使用
         (同数据库session的使用一致)

 

实战示例

    1.创建Django项目

Django之创建项目【二】:https://blog.csdn.net/Burgess_zheng/article/details/86505526

Django之session详解与实战示例(其他篇五)

    2.定义setting配置文件的静态目录路径和创建静态目录

路径:project_burgess/project_burgess/setting

Django之session详解与实战示例(其他篇五)

 

    3.定义请求的URL路由分发

路径:project_burgess/project_burgess/urls.py

from django.contrib import admin
from django.urls import path,re_path #Django版本2.0以上
from project_burgess import views
from django.conf.urls import url  #Django2.0
from django.conf.urls import include

urlpatterns = [
    path('admin/', admin.site.urls),
    
    #session
    path('login/', views.login),#最新版本的Django路由使用path
    #url(r'^login/', views.login), #2.0版本使用的是url

    path('index/', views.index),#最新版本的Django路由使用path
    #url(r'^index/', views.index), #2.0版本使用的是url

    path('logout/', views.logout),  # 最新版本的Django路由使用path
    # url(r'^logout/', views.logout), #2.0版本使用的是url

]

    4.定义url对应函数处理

路径:project_burgess/project_burgess/views.py

__author__ = "Burgess Zheng"
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from django.shortcuts import render,HttpResponse,redirect

def login(request):
    if request.method == "GET":
        return render(request,'login.html',)
    elif request.method == "POST":
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if user == 'burgess' and pwd =="123":
            #如果用户登录成功基于sesstion的话就需要以下几步
                #1.本地生成随机字符串
                #2.随机字符串写到用户浏览器cookie
                #3.保存到session中
                #4.在随机字符串对应的字典中,设置用户相关内容
            #而django已经帮我们做了以上几个步骤(1句解决),如下:
            # 记住在使用session之前一定要先 makemigrations and migrate
            request.session['username'] = user #session设置值
            request.session['is_login'] = True #session设置值
            if request.POST.get('rmb',None) == '1':
                request.session.set_expiry(10)#设置session超时10秒钟
                # request.session.set_expiry(60)#60秒后session失效
                # request.session.set_expiry(60*60)  # 1小时后session失效
                #默认配置超时是在project/setting/里面写的的
            return  redirect('/index/')
        else:
            return  render(request,'login.html')

def index(requset):
    #获取当前用户cookie的随机字符串
    #根据随机字符串获取相应信息
    #if requset.session['is_login']:
        #判断该key的状态是否为true真,如果用户没有该session的key就报错,如果没有该key就设置个None
    if requset.session.get('is_login',None): 
        username = requset.session['username']
        return render(requset,'index.html',{'username':username})
    else:
        return HttpResponse('无效session,请先登录')

def logout(request):
    request.session.clear()#该用户所有相关session都清空
    #del request.session['username'] #删除该用户相关session指定的信息
    return redirect('/login/')



    5.定义响应的html文件

涉及到csrf跳转:Django之CSRF XSS原理解析【交互篇四】 https://blog.csdn.net/Burgess_zheng/article/details/86548425

路径:project_burgess/templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <form action="/login/" method="POST">
        {% csrf_token %}
        <input type="text" name="user" />
        <input type="password" name="pwd" />
        <input type="checkbox" name="rmb" value="1"/>10秒免登陆
        <input type="submit" value="提交" />
    </form>

</body>
</html>

    路径:project_burgess/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>欢迎登录:{{ username }},{{ request.session.username }}</h1>
{#可以使用模板渲染,也可以使用request,本身session信息就在request里面#}
    <a href="/logout/">注销</a>
</body>
</html>

 

    6.启动Django

手动:python manage.py runserver 127.0.0.1:8000

pycharm:

Django之session详解与实战示例(其他篇五)

    7.浏览器访问URL结果

get请求index

Django之session详解与实战示例(其他篇五)

get请求login

Django之session详解与实战示例(其他篇五)

点击提交

Django之session详解与实战示例(其他篇五)

Django之session详解与实战示例(其他篇五)

新标签访问index

Django之session详解与实战示例(其他篇五)

点击注销

Django之session详解与实战示例(其他篇五)

10秒免登录

Django之session详解与实战示例(其他篇五)

Django之session详解与实战示例(其他篇五)

10秒后

Django之session详解与实战示例(其他篇五)

注意:其实每次刷新应该在刷新的时间重新计算失效时间:
参数设置:SESSION_SAVE_EVERY_REQUEST = True 
当然还有其他需求可以根据相关参数进行需求调整,参数在上面已经写

 

上一篇:Django之分页(其他篇四)点击跳转
下一篇:Django之缓存六种方式及实战示例(其他篇六)点击跳转​​​​​​​