django-session的设置

1.session的设置

session

依赖cookie

是一种存储数据的方式,依赖于cookie,实现本质:    
    用户(浏览器(向服务端发送请求,服务端做两件事:
      1.设置session值的时候生成随机字符串;
      2.为此用户开辟一个独立的空间来存放当前用户独有的值(数据) django存放在数据库中
      3.把生成的随机字符串作为值 sessionid作为键,发送给浏览器.  
   服务端响应
    4.当浏览再次访问服务端的时候,会去寻找存放django_session表匹配随机字符串进行解密
    5.取出用户存储的数据

在空间中如何想要设置值:

  request.session['x1'] = 123        
  request.session['x2'] = 456    
 request.session['x2']如果不存在会报错keyerror错误#在空间中取值:  
request.session.get('x2')    
#视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中
session的删除
del request.session['k1']   django-session表里面同步删除
request.session.delete()   删除当前会话的所有Session数据
request.session.flush()   
删除当前的会话数据并删除会话的Cookie。

session中的数据是根据用户相互隔离每个都是独立的

session中的数据是根据用户相互隔离.
示例 
def login(request):    # 获取用户提交的用户名和密码
    user = request.POST.get('user')    				
    request.session['user_name'] = user     
def index(request):    								
    print(request.session['user_name'])

应用场景

  • 可以权限判断 放置权限
  • 短信验证过期
  • 登陆认证

session和cookie的区别

cookie是存储在客户端浏览器上的键值对,发送请求时浏览器会自动携带 
session是一种存储数据方式 依赖cookie基于cookie实现,将数据存储在服务端 (django默认)

扩展 修改session默认存储位置

  • - (默认在数据库)
    - 小系统:默认放在数据库即可. 大系统:缓存(redis)
    
  • 文件

  • SESSION_ENGINE = 'django.contrib.sessions.backends.file' #引擎把session放入文件中
    SESSION_FILE_PATH = '/ssss/' #在根目录的/ssss生成一个随机文件
    
  • 缓存(内存)

  • SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default'
    CACHES = {    
        'default': {        
    'BACKEND':'django.core.cache.backends.locmem.LocMem Cache',        
            'LOCATION': 'unique-snowflake',   
     } 
    }
    
  • 缓存(redis)

  • SESSION_ENGINE = 'django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' 
    CACHES = {    
        "default": {        
          "BACKEND":"django_redis.cache.RedisCache",       "LOCATION": "redis://127.0.0.1:6379",        "OPTIONS": {            
     "CLIENT_CLASS":"django_redis.client.DefaultClient",            
     "CONNECTION_POOL_KWARGS": {
         "max_connections": 100}            # "PASSWORD": "密码",        }    } 
          }
    
    
  • 配置设置过期时间

  • SESSION_ENGINE = 'django.contrib.sessions.backends.db'   # 引擎(默认)
    SESSION_COOKIE_AGE = 5
    SESSION_COOKIE_NAME = "sessionid"
    

简单博客登陆(session)

检查数据的库的密码是否正确

from django.shortcuts import render,redirect
from app01 import models

def login(request):
    """
    用户登录
    :param request:
    :return:
    """
    if request.method == 'GET':
        return render(request, 'login.html')

    # 获取用户提交的用户名和密码
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')
    print(user,pwd)
    # 去数据库检查用户名密码是否正确
    user_object = models.UserInfo.objects.filter(username=user, password=pwd).first()

    if user_object:
      request.session['user_name']=user_object.username#名字存入session
        request.session['user_id']=user_object.pk#id存入session
        return redirect('/index/')#重定向页面

    # 用户名或密码输入错误
    return render(request,'login.html',{'error':'用户名或密码错误'})


def index(request):
    """
    博客后台首页
    :param request:
    :return:
    """
    name=request.session.get("user_name")
    if not name:
        return redirect('/login/')

    return render(request,'index.html',{'user':name})



··············································
简化版为了减少登陆验证的重复#使用了装饰器
··············································

from django.shortcuts import render,redirect
from app01 import models

def login(request):
    """
    用户登录
    :param request:
    :return:
    """
    if request.method == 'GET':
        return render(request, 'login.html')

    # 获取用户提交的用户名和密码
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')
    print(user,pwd)
    # 去数据库检查用户名密码是否正确
    user_object = models.UserInfo.objects.filter(username=user, password=pwd).first()

    if user_object:
      request.session['user_name']=user_object.username#名字存入session
        request.session['user_id']=user_object.pk#id存入session
        return redirect('/index/')#重定向页面

    # 用户名或密码输入错误
    return render(request,'login.html',{'error':'用户名或密码错误'})

def auth(func):#防止多次判断 简化判断 装饰器
    @functools.wraps(func)
    def inner( request,*args,**kwargs):

        name = request.session.get("user_name")#取得一个值 djano拿着这个值取对应的django的session表中按照 随机字符串为键 取得数据 进行解密 获取到对应的值
        if not name:
            return redirect('/login/')
        return func(request,*args,**kwargs)
    return inner
@auth
def index(request):
    """
    博客后台首页
    :param request:
    :return:
    """

    return render(request,'index.html')

后端操作session

# 设置(添加&修改) request.session['x1'] = 123 request.session['x2'] = 456
# 读取 
request.session['xx'] #读取不到会报key error错误
request.session.get('xx')#读取不到值返回none (不报错)
# 删除 
del request.session['xx']
request.session.keys() #获取当前session的键
request.session.values() #获取当前session的值
request.session.items() #获取当前session的键值对
# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
request.session.clear_expired(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。
request.session.session_key 获取sessionid(随机字符串)的值
#删除cookie
 第一种写法 del request.session["k1"]
 第二种写法 request.session.flush()
    def logout(request):
        rep = redirect("/login/")
        rep.delete_cookie("user")  # 删除用户浏览器上之前设置的usercookie值
        return rep

扩展 django和session相关的配置

SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key可以修改,即: sessionid=随机字符串
SESSION_COOKIE_DOMAIN = None #session的cookie保存的域名(都可以在那个域名,子域名下可用 所有的域名都可用读取到)  
# api.baidu.com /www.baidu.com/ xxx.baidu.com
SESSION_COOKIE_PATH = "/"  # Session的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,默认修改之后才保存
request会刷新 ture 按照最后一次刷新时间 false 会在两周之后过期

django中的session如何设置过期时间?

SESSION_COOKIE_AGE = 1209600  # Session的 cookie失效日期(2周)

django的session重新赋值session

把权限信息保存在session中,权限更新后,需要重新登录登录才能应用新的权限,如何能不重新登录就能应用上权限?

在修改权限时,给session数据更新即可。

给用户表中增加一个字段 存session_key 
from django.contrib.sessions.models import Session

#request.session['k1'] = 'v1'
1.可以获取到加密的信息
session = Session.objects.get(session_key='fs197249mg9uykhwmay432ct9m27jaaz')
session_data = session.session_data
print(session_data)
2.解密
data = request.session.decode(session_data) # 解密
print(data)
3.赋值
data['k1'] = 'v2'
4.加密
session_data = request.session.encode(data)   # 加密
5.重新赋值session
session.session_data = session_data   # 重新赋值
6.保存
session.save()  # 保存到数据库

2.session的存储

1.1放入数据库当中默认

保存在数据库中:需要在 INSTALL_APPS 中添加:django.contrib.sessions(默认创建项目的时候添加),然后,迁移一下
#这个是默认的

如果写了可以进行数据库的更改
SESSION_ENGINE = ‘django.contrib.sessions.backends.db’

1.2放入缓存cache中 直接放在缓存中会内存溢出

SESSION_ENGINE = ‘django.contrib.sessions.backends.cache’

解决方法 cache保存在redis数据库当中

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/0",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

1.3放入缓存加数据库

db和cache都保存,查找的时候先取cache中查找,找不到再转到db中查找

修改为: 
SESSION_ENGINE = ‘django.contrib.sessions.backends.cache_db’ 
更安全,推荐

1.4直接开辟一个新的数据库

使用 django-redis-sessions
pip install django-redis-sessions

1.配置session存储位置
   SESSION_ENGINE = 'redis_sessions.session'
2.redis的连接
   SESSION_REDIS = {
       'host': 'localhost',
       'port': 6379,
       'db': 0,
       'password': 'password',
       'prefix': 'session',
       'socket_timeout': 1
   }
3.使用示例
from django.shortcuts import render,HttpResponse

# Create your views here.
def set_session(request):
    """"保存session数据"""

    request.session['username'] = 'Django'
    request.session['verify_code'] = '123456'
    request.session.set_expiry(10)
    return HttpResponse('保存session数据成功')

def get_session(request):
    """获取session数据"""

    username = request.session.get('username')
    verify_code = request.session.get('verify_code')
    text = 'username=%s, verify_code=%s' % (username, verify_code)
    return HttpResponse(text)
posted @ 2020-04-06 13:38  strawberry*  阅读(531)  评论(0编辑  收藏  举报