Django框架
1、django框架、flask框架和Tornado框架的区别?
django框架,内置组件多,自身功能强大,是一个大而全的框架,ORM、Admin、中间件、Form、ModelFrom、信号、缓存、csrf等
flask框架,内置组件少,但第三方丰富,可扩展性强,是一个微小型框架,组件有flask-session、flask-SQLAlchemy、wtforms、flask-migrate、flask-script、blinker
相同点:
两个框架都是基于wsgi协议实现的,只是默认使用的wsgi模块不一样。 django:wsgiref模块 flask:werkzurg模块
不同点:他们各自处理请求的方式不同:
django: 通过将请求封装成Request对象,在依次通过中间件,在视图中通过参数进行传递。
flask:通过上下文管理实现。
Tornado框架:
Tornado是一个轻量级的Web框架,主要功能:异步非阻塞+内置WebSocket
2、django框架的请求周期
a. wsgi, 创建socket服务端,用于接收用户请求并对请求进行初次封装。
b. 中间件,对所有请求在到来之前,响应之前定制一些操作。
c. 路由匹配,在url和视图函数对应关系中,根据当前请求url找到相应的函数。
d. 执行视图函数,业务处理【通过ORM去数据库中获取数据,再去拿到模板,然后将数据和模板进行渲染】
e. 再经过所有中间件
f. 通过wsgi将响应返回给用户。
2.1浏览器上输入地址,回车然后发生了什么? => Http请求生命周期
1、进行域名解析获取ip, 先去本地域名服务器,如果没有再去根域名服务器
2、连接成功
3、浏览器发送数据
4、服务器接受到数据后处理并响应给浏览器
-服务器在次过程中处理流程较多,-django,flask等
3、什么是WSGI?与uWSGI的区别
WSGI是web服务网关接口--->应用程序(web框架)与web服务器之间的一种接口
实现了wsgi协议的模块本质:编写了socket服务端,用来监听用户请求,如果有请求到来,则将请求进行一次封装,然后交给 web框架来进行下一步处理。
模块有:-wsgiref -werkzurg -uwsgi
uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换
代码上线时,使用uWSGI:
1、nginx 做为代理服务器:负责静态资源发送(js、css、图片等)、动态请求转发以及结果的回复;
2、uWSGI 做为后端服务器:负责接收 nginx 请求转发并处理后发给 Django 应用以及接收 Django 应用返回信息转发给 nginx;
3、Django 应用收到请求后处理数据并渲染相应的返回页面给 uWSGI 服务器。
4、中间件
作用:对所有的请求进行批量处理,可以在视图函数执行前后进行自定义操作
应用:
-用户登录验证 --->如果使用装饰器,就必须给每个函数都添加,太繁琐
-权限处理 --->用户登录成功,将该用户所有的权限写入session中,每次访问时判断该用户是否有权限访问当前的url,这样就可以将判断用户是否用权限的操作放入中间中
-内置应用
-session
-csrf --->跨站请求伪造,防止用户直接向服务端发送POST请求。中间件拦截检验是否携带crsf_token
-全局缓存 --->如果设置了缓存,则请求进来,通过中间件后,则直接去缓存中取数据,然后响应,如果此时的缓存中没有数据,则走路由匹配、视图函数,但是在响应时会先将数据放入到缓存当中
-跨域
-cors --->浏览器的同源策略(不同的域名或不同的端口)前后端分离时,本地开发测试使用
5、csrf原理
1、浏览器向服务端发送GET请求,获取csrf_token: form表单中隐藏的input标签+保存到cookie中(通过算法)
2、再次发送POST请求时,需要携带之前发给浏览器的csrf_token,用次crsf_token与cookie中的crsf_token做验证
3、进行验证:在process_view中验证(因为只有在process_view中,才能得到视图函数,判断函数是否需要验证(加装饰器可以避免验证))
6、方法
porcess_request
porcess_view
porcess_template_response 只有在视图函数的返回值中有render方法时才调用此方法
porcess_excepion 处理异常
porcess_response
7、发送POST请求的方法
- form表单
- ajax提交
- requests.post()
方法一: $.ajax({ url:'/index', type:'POST', #携带csrf_token data:{csrfmiddlewaretoken:'{{ csrf_token }}',name:'alex'} }) 方法二: 前提:引入jquery + 引入jquery.cookie $.ajax({ url: 'xx', type:'POST', data:{name:'oldboyedu'}, #添加请求头 headers:{ X-CSRFToken: $.cookie('csrftoken') }, dataType:'json', // arg = JSON.parse('{"k1":123}') success:function(arg){ } }) 方法三:使用ajaxSetup, <body> <input type="button" onclick="Do1();" value="Do it"/> <input type="button" onclick="Do2();" value="Do it"/> <input type="button" onclick="Do3();" value="Do it"/> <script src="/static/jquery-3.3.1.min.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $.ajaxSetup({ beforeSend: function(xhr, settings) { xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken')); } }); function Do1(){ $.ajax({ url:"/index/", data:{id:1}, type:'POST', success:function(data){ console.log(data); } }); } function Do2(){ $.ajax({ url:"/index/", data:{id:1}, type:'POST', success:function(data){ console.log(data); } }); } function Do3(){ $.ajax({ url:"/index/", data:{id:1}, type:'POST', success:function(data){ console.log(data); } }); } </script> </body>