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)