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.直接装在方法上

原文地址:https://www.cnblogs.com/aden668/p/11772082.html