Django框架07 /cookie和session
1. django请求生命周期
- 浏览器上输入http://www.xxx.com 请求到达django后发生了什么? (还有中间件,此处没写)
- web服务网关接口:wsgi、uwsgi
2. cookie
示例:博客系统
-
基本实现用户登录
-
用户未登录就不能访问指定页面
- 会话
- 客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。
- 基于cookie实现
- 保存在用户浏览器端的键值对,向服务端发请求时会自动携带。保存在用户浏览器端的键值对,向服务端发请求时会自动携带。
- 会话
-
后端操作cookie
-
清除chrome浏览器页面缓存和cookie:Ctrl + Shift + del
-
获取Cookie
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) # 参数: # default: 默认值 # salt: 加密盐 # max_age: 后台控制过期时间
-
设置Cookie
rep = HttpResponse(...) rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密盐', max_age=None, ...) # 参数: # key, 键 # value='', 值 # max_age=None, 超时时间 # expires=None, 超时时间,值是一个datetime类型的时间日期对象,到这个日期就失效的意思 # path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 # domain=None, Cookie生效的域名 # secure=False, https传输 # httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
-
删除Cookie
def logout(request): rep = redirect("/login/") rep.delete_cookie("user") # 删除用户浏览器上之前设置的usercookie值 return rep
-
代码示例
def login(request): # return HttpResponse('...') # return render('...') # return redirect('...') # 设置cookie data = redirect('...') data.set_cookie() # 读取cookie request.COOKIES.get('xx') return data # 三个参数: key, value='', max_age=None
-
-
jquery操作cookie
-
操作cookie前准备
1.定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术; 2.下载与引入:jquery.cookie.js基于jquery;先引入jquery,再引入:jquery.cookie.js;下载:http://plugins.jquery.com/cookie/ 3.<script type="text/javascript" src="js/jquery.min.js"></script> <script type="text/javascript" src="js/jquery.cookie.js"></script>
-
添加cookie
// 1.添加一个"会话cookie" $.cookie('the_cookie', 'the_value'); //这里没有指明 cookie有效时间,所创建的cookie有效期默认到用户关闭浏览器为止,所以被称为 “会话cookie(session cookie)”。 // 2.创建一个cookie并设置有效时间为 7天 $.cookie('the_cookie', 'the_value', { expires: 7 }); //这里指明了cookie有效时间,所创建的cookie被称为“持久 cookie (persistent cookie)”。注意单位是:天; // 3.创建一个cookie并设置 cookie的有效路径 $.cookie('the_cookie', 'the_value', { expires: 7, path: '/' }); //在默认情况下,只有设置 cookie的网页才能读取该 cookie。如果想让一个页面读取另一个页面设置的cookie,必须设置cookie的路径。cookie的路径用于设置能够读取 cookie的顶级目录。将这个路径设置为网站的根目录,可以让所有网页都能互相读取 cookie (一般不要这样设置,防止出现冲突)。
-
读取cookie
$.cookie('the_cookie');
-
删除cookie
$.cookie('the_cookie', null); //通过传递null作为cookie的值即可
-
可选参数
$.cookie('the_cookie','the_value',{ expires:7, path:'/', domain:'jquery.com', secure:true }) // expires:(Number|Date)有效期;设置一个整数时,单位是天;也可以设置一个日期对象作为Cookie的过期日期; // path:(String)创建该Cookie的页面路径; // domain:(String)创建该Cookie的页面域名; // secure:(Booblean)如果设为true,那么此Cookie的传输会要求一个安全协议,例如:HTTPS;
-
注意点
// js操作 document.cookie = 'k1=liu;path=/' // jquery操作 $.cookie('k1','liu',{path:'/'}) // 注意:path不同会导致设置不同. //path的作用 // / , 当前网站中所有的URL都能读取到此值. // "",只能在当前页面访问的到此数据. // /index/ ,只能在/index/xxx 的网页中查看. // 在浏览器操作cookie是路径path不写默认是""
-
3. session
-
基于session实现保留会话信息 / 推荐
-
什么是session
依赖cookie 是一种存储数据的方式,依赖于cookie,实现本质: 用户向服务端发送请求,服务端做两件事: 1.生成随机字符串; 2.为此用户开辟一个独立的空间来存放当前用户独有的值. 在空间中如何想要设置值: request.session['x1'] = 123 request.session['x2'] = 456 在空间中取值: request.session['x2'] request.session.get('x2') 视图函数中的业务操作处理完毕,给用户响应,在响应时会将随机字符串存储到用户浏览器的cookie中.
-
cookie和session的区别
答: cookie是存储在客户端浏览器上的键值对,发送请求时浏览器会自动携带. session是一种存储数据方式,基于cookie 实现,将数据存储在服务端(django默认存储到数据库).其本质是: 用户向服务端发送请求,服务端做两件事:生成随机字符串;为此用户开辟一个独立的空间来存放当前用户独有的值. 在空间中如何想要设置值: request.session['x1'] = 123 request.session['x2'] = 456 在空间中取值: request.session['x2'] request.session.get('x2') 视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
-
django中session相关的配置 / 拓展
1.SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即: sessionid=随机字符串 2.SESSION_COOKIE_DOMAIN = None # api.baidu.com /www.baidu.com/ xxx.baidu.com 3.SESSION_COOKIE_PATH = "/" # Session的cookie 保存的路径 4.SESSION_COOKIE_HTTPONLY = True # 是否 Session的cookie只支持http传输,js获取不到 5.SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周) 6.SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期 7.SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存 # django中的session如何设置过期时间? SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
-
django的session默认存储在数据库,可以放在其他地方吗
- 小系统:默认放在数据库即可.
- 大系统:缓存(redis)
- 放在文件中配置
SESSION_ENGINE = 'django.contrib.sessions.backends.file' SESSION_FILE_PATH = '/sessiondata/'
- 缓存(内存)
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
# 设置(添加&修改) request.session['x1'] = 123 request.session['x2'] = 456 # 读取 request.session['xx'] request.session.get('xx') # 删除 del request.session['xx'] # 删除当前会话的所有Session数据 request.session.delete() # 删除cookie以及session request.session.flush()
request.session.keys() request.session.values() request.session.items() request.session.session_key # 获取sessionid的值 request.session.set_expiry(value) # 设置会话Session和Cookie的超时时间 # 如果value是个整数,session会在些秒数后失效。 # 如果value是个datatime或timedelta,session就会在这个时间后失效。 # 如果value是0,用户关闭浏览器session就会失效。 # 如果value是None,session会依赖全局session失效策略。
4. 总结
-
cookie/session的应用场景
- 用户认证
- 投票
- 短信验证过期
- 权限管理
-
session中的数据是根据用户相互隔离.
# 示例 def login(request): # 获取用户提交的用户名和密码 user = request.POST.get('user') request.session['user_name'] = user def index(request): print(request.session['user_name'])
-
cookie代码示例
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') # 去数据库检查用户名密码是否正确的两种方式 # user_object = models.UserInfo.objects.filter(username=user,password=pwd).first() # user_object = models.UserInfo.objects.filter(username=user, password=pwd).exists() user_object = models.UserInfo.objects.filter(username=user, password=pwd).first() if user_object: # 用户登录成功 result = redirect('/index/') result.set_cookie('xxxxxxxx',user) return result # 用户名或密码输入错误 return render(request,'login.html',{'error':'用户名或密码错误'}) def index(request): """ 博客后台首页 :param request: :return: """ user = request.COOKIES.get('xxxxxxxx') if not user: return redirect('/login/') return render(request,'index.html',{'user':user})
-
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('username') pwd = request.POST.get('password') ret = models.UserInfo.objects.filter(username=user,password=pwd).first() if ret: request.session['user_name'] = ret.username return redirect('/index/') return render(request,'login.html',{'error':'用户名或密码错误'}) #构建装饰器 import functools def auth(f): @functools.wraps(f) def inner(request,*args,**kwargs): user = request.session.get('user_name') if not user: return redirect('/login/') return f(request,*args,**kwargs) return inner @auth def index(request): ''' 博客后台首页 :param request: :return: ''' return render(request,'index.html')