Flask总结篇

1 Flask框架的优点?

相信作Python这一块的程序员都有据说这三个框架,就像神同样的存在,每个框架的介绍我就不写出来了,感兴趣能够本身百度了解了解!下面我就说正事

Django:Python 界最全能的 web 开发框架,battery-include 各类功能完备,可维护性和开发速度一级棒。常有人说 Django 慢,其实主要慢在 Django ORM 与数据库的交互上,因此是否选用 Django,取决于项目对数据库交互的要求以及各类优化。而对于 Django 的同步特性致使吞吐量小的问题,其实能够经过 Celery 等解决,倒不是一个根本问题。Django 的项目表明:Instagram,Guardian。

Tornado:天生异步,性能强悍是 Tornado 的名片,然而 Tornado 相比 Django 是较为原始的框架,诸多内容须要本身去处理。固然,随着项目愈来愈大,框架可以提供的功能占比愈来愈小,更多的内容须要团队本身去实现,而大项目每每须要性能的保证,这时候 Tornado 就是比较好的选择。Tornado项目表明:知乎。

Flask:微框架的典范,号称 Python 代码写得最好的项目之一。Flask 的灵活性,也是双刃剑:能用好 Flask 的,能够作成 Pinterest,用很差就是灾难(显然对任何框架都是这样)。Flask 虽然是微框架,可是也能够作成规模化的 Flask。加上 Flask 能够自由选择本身的数据库交互组件(一般是 Flask-SQLAlchemy),并且加上 celery + redis 等异步特性之后,Flask 的性能相对 Tornado 也不逞多让,也许Flask 的灵活性多是某些团队更须要的。

总结,萝卜白菜各有所爱,然而机器的效率(程序的性能)与程序员的效率(可维护性、开发速度)是一对矛盾。选择什么样的架构组合,取决于产品的特性以及团队的能力。

2 Flask框架依赖组件

依赖jinja2模板引擎
依赖werkzurg协议

3 Flask蓝图的做用

blueprint把实现不一样功能的module分开.也就是把一个大的App分割成各自实现不一样功能的module. 在一个blueprint中能够调用另外一个blueprint的视图函数, 但要加相应的blueprint名.

4.列举使用的Flask第三方组件?

# Flask组件
    flask-session session放在redis
    flask-SQLAlchemy    如django里的ORM操做
    flask-migrate    数据库迁移
    flask-script     自定义命令
    blinker          信号-触发信号

# 第三方组件
    Wtforms 快速建立前端标签、文本校验
    dbutile 建立数据库链接池
    gevnet-websocket 实现websocket

# 自定义Flask组件
    自定义auth认证
    参考flask-login组件

5 简述Flask上下文管理流程 ?

falsk上下文管理能够分为三个阶段:

一、请求上文 -> 当请求进来,第一件事就是要把当前这个请求在我服务器上的线程开辟一个空间(线程对应的空间,必须含有stack对用一个列表存放ctx(request/session),
具体-->:将request,session封装在 RequestContext类中
app,g封装在AppContext类中 并经过LocalStack将requestcontext和appcontext放入Local类中 在local类中,以线程ID号做为key的字典

二、请求下文: 经过localproxy--->偏函数--->localstack--->local取值

三、'请求响应时':-->要将上下文管理中的数据清除 先执行save.session()再各自执行pop(),将local中的数据清除

6 Flask中的g的做用?

在flask中,有一个专门用来存储用户信息的g对象,g的全称的为global。 当请求进来将g和current_app封装为一个APPContext类, 再经过LocalStack将Appcontext放入Local中,取值时经过偏函数在LocalStack、local中取值; 响应时将local中的g数据删除
g与session的区别 session对象是能够跨request的,只要session还未失效,不一样的request的请求会获取到同一个session,可是g对象 不是,g对象不须要管过时时间,请求一次就g对象就改变了一次,或者从新赋值了一次。那么g对象该如何使用呢?看代码。

7 Flask中上下文管理主要涉及到了那些相关的类?并描述类主要做用?

RequestContext  # 封装进来的请求(赋值给ctx)request.session
AppContext      # 封装app_ctx
LocalStack      # 将local对象中的数据维护成一个栈(先进后出)
Local           # 保存请求上下文对象和app上下文对象

8 为何要Flask把Local对象中的的值stack维护成一个列表?

由于经过维护成列表,能够实现一个栈的数据结构,进栈出栈时只取一个数据,巧妙的简化了问题。 还有,在多app应用时,能够实现数据隔离;列表里不会加数据,而是会生成一个新的列表 local是一个字典,字典里key(stack)是惟一标识,value是一个列表

9 Flask中多app应用是怎么完成?

请求进来时,能够根据URL的不一样,交给不一样的APP处理。蓝图也能够实现。
# app1 = Flask('app01')
# app2 = Flask('app02')
# @app1.route('/index')
# @app2.route('/index2')
源码中在DispatcherMiddleware类里调用app2.__call__, 原理其实就是URL分割,而后将请求分发给指定的app。以后app也按单app的流程走。就是从app.__call__走。

10 在Flask中实现WebSocket须要什么组件?

gevent-websocket

11 wtforms组件的做用?

快速建立前端标签、文本校验;如django的ModelForm

12 Flask框架默认session处理机制?

基于cookie实现, 存储在 客户端的cookie中
必须设置默认的key才能生效

13 解释Flask框架中的Local对象和threading.local对象的区别?

有些应用使用的是greenlet协程,这种状况下没法保证协程之间数据的隔离,由于不一样的协程能够在同一个线程当中。 即便使用的是线程,WSGI应用也没法保证每一个http请求使用的都是不一样的线程,由于后一个http请求可能使用的是以前的 http请求的线程,这样的话存储于thread local中的数据多是以前残留的数据。

为了解决上述问题,Werkzeug开发了本身的local对象,这也是为何咱们须要Werkzeug的local对象

14 Flask中blinker是什么?

flask中的信号blinker
信号主要是让开发者但是在flask请求过程当中定制一些行为。
或者说flask在列表里面预留了几个空列表,在里面存东西。
简言之,信号容许某个'发送者'通知'接收者'有事情发生了

15 SQLAlchemy中的session和scoped_session的区别?

scoped_session封装了两个值 Session 和 registry,registry加括号就执行了ThreadLocalRegistry的 __call__方法,
若是当前本地线程中有session就返回session,没有就将session添加到了本地线程 scoped_session为每一个线程建立一个session,确保了线程安全

16 SQLAlchemy如何执行原生SQL?

# 总的数据sql
sql_str = "select * from (" \ 
"select *, 0 as ord from sale_goods where goods_type = 'sale-goods' and delete = false and total_count > 0 and deadline > now()" \
"union " \ 
"select *, 1 as ord from sale_goods where goods_type = 'sale-goods' and delete = false and (total_count <= 0 or deadline <= now())" \ 
") sale_goods_mall order by ord asc, c_time desc limit %d offset %d;" % (limit, limit * (pages - 1))

# 在售的数据sql
in_sale_sql = "select *, 0 as ord from sale_goods where goods_type = 'sale-goods' and delete = false and total_count > 0 and deadline > now();"

# sqlalchemy执行sql
data_query = db.session.execute(sql_str)
in_sale_query = db.session.execute(in_sale_sql)

17 ORM的实现原理?

1. 映射类:它的做用是描述数据库表的结构,表中的字段在类中被描述成属性,未来就能够实现把表中的记录映射成为该类 的对象。
2. 映射文件:它的做用是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对 应关系以及表字段和类属性名称的对应关系等。
3. 数据库配置文件:它的做用是指定与数据库链接时须要的链接信息,好比链接哪中数据库、登陆用户名、登陆密码以及 链接字符串等。

18 FLASK传送门

相关文章
相关标签/搜索