Flask

1. django和flask区别?

对于django来说吧,内部组件就特别多,功能也都挺完善的,(有那种大而成的感觉)
对于flask,内部组件就比较少了,但是有很多第三方组件组件来扩展它,所以呢,他的可扩展行就比较强了,(所以对他本身来说有那种短小精悍的感觉)
这就是他们大体上的区别。

对于他们2个共同点:他们2个框架都没写socket,所以他们都是第三方模块wsgi,django本身运行起来使用wsgiref  而flask是用Werkzeug WSGI


最重要的的是flask他有那个上下文管理机制,挺牛逼的

2. flask内置组件

 

- 3. Flask上下文管理是如何实现?

- 4. 为什么要创建LocalStack类 or Local对象中为什么保存成 {111:{stack:[ctx, ]}}
Web应用时:
- 服务端单线程:
{
111:{stack: [ctx, ]}
}
- 服务端多线程:
{
111:{stack: [ctx, ]}
112:{stack: [ctx, ]}
}
离线脚本:
with app01.app_context():
print(current_app)
with app02.app_context():
print(current_app)
print(current_app)
PS: 实现栈

5.Flask第三组件

- flask-session 
- flask-sqlalchemy
- flask-migrate
- flask-script
- DBUtils
- wtforms
- 自定义 Auth,参考:flask-login组件

问题一:flask和django的区别:
  对于django来说,内部组件特别多,自身功能强大,给人一种大而全的感觉,而flask,内置组件很少,但是它的第三方组件很多,扩展性强,有点短小精悍,而它们之间也有相似之处,
  因为它们两个框架都没有写sockte,都是基于wsgi协议做的,在此之外,flask框架中的上下文管理较为耀眼。

  
  相同点:它们两个框架都没有写sockte,都是基于wsgi协议做的
  请求相关数据传递的方式不同:django:通过传递request参数取值
                flask:见问题二
           组件不同:django组件多
                flask组件少,第三方组件丰富

问题1.1: flask上下文管理:
  简单来说,falsk上下文管理可以分为三个阶段:
        1、请求进来时,将请求相关的数据放入上下问管理中
        2、在视图函数中,要去上下文管理中取值
        3、请求响应,要将上下文管理中的数据清除
  
  详细点来说:
        1、请求刚进来,将request,session封装在RequestContext类中,app,g封装在AppContext类中,并通过LocalStack将requestcontext和appcontext放入Local类中
        2、视图函数中,通过localproxy--->偏函数--->localstack--->local取值
        3、请求相应时,先执行save.session()再各自执行pop(),将local中的数据清除
        

问题1.2  flask第三方组件
  flask:
      -flask-session    默认放入cookie,可以放入redis
      -flask-redis
      -flask-migrate
      -flask-script
      -blinker  信号
   公共: DBUtils      数据库连接池
      wtforms       表单验证+生成HTML标签
      sqlalchemy
  自定义:Auth   参考falsk-login

问题二:Flask中的session是什么时候创建,什么时候销毁的?
  当请求进来时,会将requset和session封装为一个RequestContext对象,通过LocalStack将RequestContext放入到Local对象中,因为
请求第一次来session是空值,所以执行open_session,给session(uuid4())赋值,再通过视图函数处理,请求响应时执行save.session,将签名session写入cookie中,再讲Local中的数值pop掉。

问题三:flask中一共有几个LocalStack和Local对象
  两个LocalStack,两个Local
  request、session共同用一个LocalStack和Local
  g、app共同用一个Localstack和Local

问题四: 为什么把请求放到RequestContext中:
   因为request和session都是在视图中操作频繁的数据,也是用户请求需要用的数据,将request和session封装在RequestContext中top,pop一次就可以完成,而单独不封装在一起就会多次操作,

    ctx = RequestContext(request,session)

问题五:local作用
    -保存    请求上下文对象和app上下文对象

     -localstack的源码与threading.local(线程处理)作用相似,不同之处是Local是通过greenlet(协程)获取唯一标识,粒度更细
      
 问题六:Localstack作用
    2、将local对象中的数据维护成一个栈【ctx,ctx】(先进后出)
         {
            “协程或线程的唯一标识”: { stack:[ctx,ctx,ctx,] }
         }
    

为什么维护成一个栈?
    当是web应用时:不管是单线程还是多线程,栈中只有一个数据
   - 服务端单线程:
        {
            111:{stack: [ctx, ]}
        }
   - 服务端多线程:
        {
            111:{stack: [ctx, ]}
            112:{stack: [ctx, ]}
        }
离线脚本:可以在栈中放入多个数据,在任何情况下都可以获取到当前app的请求和响应
with app01.app_context():
                      print(current_app)
                      with app02.app_context():
                            print(current_app)
                      print(current_app)

 
 问题七:什么是g?
    g 相当于一次请求的全局变量,当请求进来时将g和current_app封装为一个APPContext类,在通过LocalStack将Appcontext放入Local中,取值时通过偏函数,LocalStack、loca l中取值,响应时将local中的g数据删除:
 
    问题八:怎么获取Session/g/current_app/request
    通过 、偏函数(lookup_req_object)、Localstack、Local取值
1、反射
  -CBV
  -django配置文件
  -wtforms中的Form()示例化中 将"_fields中的数据封装到From类中"

 

posted @ 2018-05-07 19:37  小杜要加油  阅读(80)  评论(0)    收藏  举报