zoukankan      html  css  js  c++  java
  • cookie,session,django中间件,csrf回顾

    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.直接装在方法上
    
    
  • 相关阅读:
    Linux读写执行权限对目录和文件的影响
    配置DNS服务安全加密传输遇到的问题
    如何将vim编辑器中的内容,按照列提取信息后,重新输入到文件中?
    虚拟机配置仅主机模式,无法ping通网关
    配置计划任务
    内存检测的脚本文件
    mount挂载的小问题:mount: no medium found on /dev/sr0
    名词解释
    电流、电压、功率的计算方式
    name 、 request_name 、 session_name 优先级
  • 原文地址:https://www.cnblogs.com/aden668/p/11772082.html
Copyright © 2011-2022 走看看