cookie与session
cookie与session的概念
1.起源
由于http协议是无状态的无法保存用户状态 所以需要发明一些能够保存用户状态的技术
2.cookie
保存在浏览器上的键值对
cookie虽然是保存在客户端浏览器上的,但是是服务端设置的
也就意味着 浏览器有权限禁止服务端写入cookie
3.session
由于cookie是将所有的关键性信息保存在客户端浏览器上的 数据不是很安全
所以有了session:session就是将数据保存在服务端 只给客户端浏览器一个随机字符串
服务端记录了 随机字符串与真实数据的对应关系
django如何操作cookie与session
1 django操作cookie
由于视图函数返回的都是HttpResponse对象 所以可以利用该对象来操作cookie
return HttpResponse()
obj = HttpResponse()
obj.set_cookie(key,value) # 告诉浏览器在本地保存一个键值对
obj.set_cookie(key,value,max_age=5) # 还可以设置超时时间
return obj
2.基于cookie做用户的登录认证
request.COOKIES.get(key) # 检验用户是否登录
如何保存用户在没有登录之前想访问的那个页面的url,然后当用户用户名和密码输入正确点击登录之后再跳转会去
request.path_info # 只拿后缀
request.get_full_path() # 后缀加get请求携带的参数
利用上面的方法在装饰器中获取用户想要访问的url
在跳转到登录页面的url的时候 以get请求携带参数的方式将用户想要访问的url携带过去
在登录的视图函数中 对url进行判断
1.用户没有登录的情况下访问了一个必须登录的页面
2.用户直接访问的就是登录页面
3.操作session
设置
request.session['key'] = value
"""
1.django内部自动随机生成一个随机字符串
2.在服务端默认情况下需要django_session表来存储session信息(没有执行数据库迁移命令会报错)
django session默认的过期时间是14天
3.将随机字符串发送给客户端浏览器 让浏览器写入cookie
sessionid : 随机字符串
"""
获取
request.session.get('key')
"""
1.会自动去客户端浏览器发送过来的数据中查找cookie信息
2.拿着该信息去django_session表中比对
3.无论有没有数据 你都可以通过request.session.get()
1.没有返回的结果就是None
2.有则返回随机字符串所对应的真实数据
"""
设置超时时间
request.session.set_expiry(value)
value
数字
0
时间格式
不写
删除session
request.session.flush()
request.session.delete()
额外知识点补充
session是保存在服务端上的键值对
1.数据库
2.文件
3.缓存数据库
4....
一句话 后端可以用很多种方式来保存session信息 并不是只能保存在数据库中
django中间件
django中间件是django的门户 任何的请求来和响应走都需要经过中间件,所以中间件在做一些网站全局性的功能时特别好用
1.校验用户访问频率
2.校验用户黑名单 白名单
3.获取用户权限
在web领域 权限其实就是一个个的url
(CRM项目)
RBAC 基于角色权限管理
权限表
用户表
角色表
用户表和角色表 可以是多对多
角色和权限也是一个 多对多
1 实现给每一个角色绑定响应的权限
2 创建用户的时候只需要指定该用户的角色即可
3 在用户登录的时候 在中间件中获取到该用户所有的权限
4 然后用户每一次访问url的时候 都去校验是都在用户可以访问的url列表中
django默认有七个中间件 并且支持用户自定义自己的中间件
1 django暴露给用户五个可以自定义的方法
需要掌握的
process_request
1.请求来的时候 会按照settings配置文件中从上往下的顺序依次执行每一个中间件里面的该方法
2.中间件里面如果没有定义该方法 直接跳过执行下一个
3.该方法内如果你自己返回了HttpResponse对象 那么不再往后执行 直接跳到同级别的process_response方法
process_response
1.响应走的时候 会按照settings配置文件中从下往上的顺序依次执行每一个中间件里面的该方法
2.该方法必须将形参response返回
3.如果没有定义该方法 直接跳过执行下一个
需要了解的
process_view
当路由匹配成功之后执行视图函数之前
process_exception
当视图函数中出现bug的时候 自动触发
process_template_response
返回的对象中 必须含有render方法 才会触发
2.如何自定义
1 新建一个专门用来存放中间件的文件夹 里面新建任何名称的py文件
在该文件中 需要写类并继承MiddleMixin
class MyMiddle(MiddleMixin):
# 自定义上面的五个方法
2 需要在setting配置文件中注册你写的中间件
需要你自己手动书写字符串的路径 写到类名为止
csrf跨站请求伪造
钓鱼网站
正规网站在返回给用户含有post请求的页面 都附带了一个随机的字符串
然后下一次用户在提交post请求的时候 会先校验该随机字符串是否存在并判断是否一致
form表单
在form标签内写
{% csrf_token %}
ajax中如何避免
1.通过标签查找的方式
{'csrfmiddlewaretoken':$('[name="csrfmiddlewaretoken"]').val()}
2.第二种
{'csrfmiddlewaretoken':'{{ csrf_token }}'}
3.第三种
# 直接拷贝官网提供的js文件 动态获取
# 你只需要在你的页面上导入该文件即可
相关装饰器
csrf_exempt
csrf_protect
在给CBV装饰的时候有区别
1.需要导入一个固定的装饰器 method_decorator(装饰器,方法名)
csrf_exempt这个装饰器比较特殊 装饰的时候 只能给dispatch方法装
2.其他的装饰器 自定义的 模块的
1.直接类外面指名道姓的装
2.给dispatch装
3.直接装在方法上