cookie 和 session 的一些事 中间件
cookie 1. 保存在浏览器上一组组键值对,服务器让浏览器进行设置。 2. 为什么要用cookie? HTTP协议是无状态。使用cookie保存状态。 3. django中的操作 设置: response.set_cookie(key,value,max_age=5) response.set_signed_cookie(key,value,max_age=5,salt='xxx') 获取: request.COOKIES request.COOKIES[key] request.COOKIES.get(key) request.get_signed_cookie(key,salt='xxx',default='') 删除: response.delete_cookie(key) session 1. 保存在服务器上一组组键值对,依赖于cookie 2. 为什么要用session? 1. cookie保存在浏览器上,不安全 2. 长度大小收到限制 3. django中的操作 1. 设置 request.session[key] = value request.session.setdefault(key,value) 2. 获取 request.session[key] request.session.get(key) 3. 删除 del request.session[key] request.session.delete() # 删除当前回话的所有session数据,不删除cookie request.session.flush() # 删除当前回话的所有session数据,删除cookie 4. 其他 request.session.clear_expired() # 清除已过期的session request.session.set_expiry(value) #设置过期时间 0时关闭浏览器就失效. 5. 配置 from django.conf import global_settings #全局设置
django 中的中间件
django中的中间件是一个类,在全局范围内改变django的输入和输出 from django.utils.deprecation import MiddlewareMixin 五种方法: process_request(self, request): 执行时间:在视图执行之前 执行顺序:按照 注册顺序 顺序 执行 返回值: None:正常流程 HttpResponse对象:不执行下一个中间件中的process_request,不执行路由匹配,不执行视图,直接执行当前中间件的process_response方法。 process_response(self, request, response) 执行时间:在视图执行之后 执行顺序:按照注册顺序倒叙执行 返回值: HttpResponse对象 process_view(self, request, view_func, view_args, view_kwargs) 执行时间:在视图执行之前,路由匹配之后 执行顺序:按照注册顺序顺序执行 返回值: None:正常流程 HttpResponse对象:不执行下一个中间件中的process_view,不执行视图,直接执行所有中间件中最后一个中间件的process_response方法。 process_exception(self, request, exception) 执行时间:视图层面报错时执行 执行顺序:按照注册顺序倒序执行 返回值: None:交给下一个中间件处理异常 HttpResponse对象:不执行下一个中间件中的process_exception,执行所有中间件中最后一个中间件的process_response方法。 process_template_response(self, request, response) 执行时间:返回的response对象是template_response,或者response对象有一个render的方法 执行顺序:按照注册顺序倒序执行 返回值: HttpResponse对象
csrf 跨站请求伪造 django中跨站请求伪造的保护机制 装饰器 from django.views.decorators.csrf import csrf_exempt,csrf_protect csrf_exempt 加在视图上,表示当前视图不进行csrf校验 不注释中间件,都进行校验,除了这个被装饰的函数 csrf_protect 加在视图上,表示当前视图进行csrf校验 注释中间件下,@csrf_protect加在视图函数上,其他都不校验,只这个
from django.shortcuts import render, HttpResponse from django.template.response import TemplateResponse from django.views.decorators.csrf import csrf_exempt, csrf_protect def index(request, pk): print('index') # print(id(request)) ret = HttpResponse('o98k') def xxx(): return HttpResponse('快开学了') ret.render = xxx ret.set_signed_cookie() return ret # return TemplateResponse(request, 'index.html', {'index': '放假了'}) @csrf_exempt #除了 # @csrf_protect #保护 def home(request): return render(request, 'home.html') from django.views import View from django.utils.decorators import method_decorator #方法装饰器 class Home(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): ret = super().dispatch(request, *args, **kwargs) return ret def get(self, request): return render(request, 'home.html') # @装饰器加在这里不行 def post(self, request): return render(request, 'home.html')
CBV情况,csrf_exempt装饰器要加在dispatch上
-
process_request(self, request):
从cookie中获取csrftoken的值 —— 》 request.META['CSRF_COOKIE']
-
process_view:
-
判断视图是否加上csrf_exempt,
-
有就不在进行csrf校验
-
没有继续进行校验
-
-
判断请求方式是'GET', 'HEAD', 'OPTIONS', 'TRACE',
-
是的话,不进行校验
-
不是的话,进行校验
-
-
进行校验的:
-
csrf_token = request.META.get('CSRF_COOKIE') # csrf_token = cookie中获取csrftoken的值 -
先尝试从request.POST获取csrfmiddlewaretoken对应的值
request_csrf_token = request.POST.get('csrfmiddlewaretoken', '') # 获取隐藏标签的csrfmiddlewaretoken对应的值
再尝试从请求头中获取X-csrftoken的值
request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '') -
拿csrf_token和request_csrf_token 进行对比
-
对比成功,校验成功
-
对比不成功,校验失败,拒绝
-
-
-