? 1.起源
? 由于http协议是无状态的无法保存用户状态 所以需要发明一些能够保存用户状态的技术
? 2.cookie
? 保存在浏览器上的键值对
? cookie虽然是保存在客户端浏览器上的,但是是服务端设置的
? 也就意味着 浏览器有权限禁止服务端写入cookie
? 3.session
? 由于cookie是将所有的关键性信息保存在客户端浏览器上的 数据不是很安全
? 所以有了session: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的门户 任何的请求来和响应走都需要经过中间件,所以中间件在做一些网站全局性的功能时特别好用
1.校验用户访问频率
2.校验用户黑名单 白名单
3.获取用户权限
在web领域 权限其实就是一个个的url
(CRM项目)
RBAC 基于角色权限管理
权限表
? 用户表
? 角色表
用户表和角色表 可以是多对多
角色和权限也是一个 多对多
1 实现给每一个角色绑定响应的权限
2 创建用户的时候只需要指定该用户的角色即可
3 在用户登录的时候 在中间件中获取到该用户所有的权限
4 然后用户每一次访问url的时候 都去校验是都在用户可以访问的url列表中
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配置文件中注册你写的中间件
需要你自己手动书写字符串的路径 写到类名为止
钓鱼网站
正规网站在返回给用户含有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.直接装在方法上
cookie,session,django中间件,csrf回顾
原文:https://www.cnblogs.com/aden668/p/11772082.html