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上下文管理可以分为三个阶段:
1、请求上文 -> 当请求进来,第一件事就是要把当前这个请求在我服务器上的线程开辟一个空间(线程对应的空间,必须含有stack对用一个列表存放ctx(request/session),
具体-->:将request,session封装在 RequestContext类中
app,g封装在AppContext类中 并通过LocalStack将requestcontext和appcontext放入Local类中 在local类中,以线程ID号作为key的字典
2、请求下文: 通过localproxy--->偏函数--->localstack--->local取值
3、'请求响应时':-->要将上下文管理中的数据清除 先执行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传送门
Flask总结篇的更多相关文章
- Flask最强攻略 - 跟DragonFire学Flask - 第二篇 Flask 中的 Render Redirect HttpResponse
1.Flask中的HTTPResponse 在Flask 中的HttpResponse 在我们看来其实就是直接返回字符串 2.Flask中的Redirect 每当访问"/redi" ...
- Flask最强攻略 - 跟DragonFire学Flask - 第九篇 Flask 中的蓝图(BluePrint)
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- Flask最强攻略 - 跟DragonFire学Flask - 第一篇 你好,我叫Flask
首先,要看你学没学过Django 如果学过Django 的同学,请从头看到尾,如果没有学过Django的同学,并且不想学习Django的同学,轻饶过第一部分 一. Python 现阶段三大主流Web框 ...
- 第二篇 Flask基础篇之(闪现,蓝图,请求扩展,中间件)
本篇主要内容: 闪现 请求扩展 中间件 蓝图 写装饰器,常用 functools模块,帮助设置函数的元信息 import functools def wrapper(func): @functools ...
- 第一篇 Flask基础篇之(配置文件,路由系统,模板,请求响应,session&cookie)
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...
- flask 第九篇 蓝图 Blueprint
蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看 ...
- flask第二篇 三剑客+特殊返回值
1.Flask中的HTTPResponse 在Flask 中的HttpResponse 在我们看来其实就是直接返回字符串 2.Flask中的Redirect 每当访问"/redi" ...
- flask入门篇
flask,Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 . Flask简单易学,属于轻量级的,学起来 ...
- flask第九篇——url_for【2】
上一节说的是没有参数的url_for,如果没有参数,可以直接url_for('函数名')那如果我们构造的函数是: @app.route('/login/<page_id>/')def ...
- Flask 学习篇二:学习Flask过程中的记录
Flask学习笔记: GitHub上面的Flask实践项目 https://github.com/SilentCC/FlaskWeb 1.Application and Request Context ...
随机推荐
- 【批处理】if命令,注释方式
If 命令 if 表示将判断是否符合规定的条件,从而决定执行不同的命令. 有三种格式:1.if "参数" == "字符串" 待执行的命令参数如果等于指定的字符串 ...
- Redis存储Hash
结构: 1.存取操作: (1)单个存取: (2)一次存储多个,单个取出: 一次取出多个·: (3)取出全部的键和值: 2.删除: (1)删除单个键值对: (2)删除所有键值对: 3.增加数值: 4.减 ...
- 数组(定义、遍历、冒泡排序、合并和Join 方法)
一.数组的定义 1.理解:数组指一组数据,有序的数据,可以一次性存储多个数据,将多个元素(通常统一类型)按照一定的顺序排列放到一个集合里 2.通过构造函数创建数组: var 数组名=new Arrar ...
- 超参数(Hyperparameter)
什么是超参数? 机器学习模型中一般有两类参数:一类需要从数据中学习和估计得到,称为模型参数(Parameter)---即模型本身的参数.比如,线性回归直线的加权系数(斜率)及其偏差项(截距)都是模型参 ...
- 【luoguP4544】[USACO10NOV]购买饲料Buying Feed
题目链接 首先把商店按坐标排序 \(dp_{i,j}\)表示前i个商店买了j吨饲料并运到终点的花费,二进制拆分优化转移 #include<algorithm> #include<io ...
- pyqt5设置背景图片出现问题
在使用pyqt5时,用qtdesign设置好背景图片,如何设置自行百度,预览没问题,用ptuic5转换为代码却发现显示不了: 首先:我在qtdesign中导入的是pic.qrc,但是转换的代码最后一句 ...
- python opencv PyQt5
import cv2 import numpy as np import sys from PyQt5.QtGui import * from PyQt5.QtCore import * from P ...
- slot 插槽子组件向父组件传值
slot 插槽要实现子组件向父组件传值,则需要运用 作用域插槽 1.父组件中用 标签加上 slot-scoped 的属性,属性值随性.(旧版本是scope,vue新版本必须用slot-scope) 2 ...
- SQL Server 变量定义
declare @id intdeclare @name char(10) --注意:char(10)为10位,要是位数小了会让数据出错set @id=1 set @name='sssss'selec ...
- word 转 pdf,c#代码
通过使用 C# 控制 office 软件 com 组件转 pdf 1 word 转 pdf 方案二:可以使用 netoffice 进行转换 参考文档:https://netoffice.io/docu ...