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将响应返回给用户。

二、python框架相关知识体系

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请求的方法

  1. form表单
  2. ajax提交
  3. 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>
ajax提交

相关文章:

  • 2021-10-15
  • 2021-05-24
  • 2021-04-03
  • 2022-01-31
  • 2021-04-17
  • 2022-12-23
  • 2021-05-28
  • 2022-12-23
猜你喜欢
  • 2021-04-25
  • 2022-12-23
  • 2022-12-23
  • 2021-06-02
  • 2021-08-13
  • 2021-10-12
  • 2021-07-20
相关资源
相似解决方案