实现从项目调研、数据收集、数据预处理、深度卷积神经网络训练再到服务器部署的人脸表情识别小项目
一、python常用框架
1、Django: Python Web应用开发框架,路由系统、视图和模板(简单介绍)
2、Diesel:基于Greenlet的事件I/O框架
3、Flask:一个用Python编写的轻量级Web应用框架
4、Cubes:轻量级Python OLAP框架
5、Kartograph.py:创造矢量地图的轻量级Python框架
6、Pulsar:Python的事件驱动并发框架
7、Web2py:全栈式Web框架
8、Falcon:构建云API和网络应用后端的高性能Python框架
9、Dpark:Python版的Spark
10、Buildbot:基于Python的持续集成测试框架
11、Zerorpc:基于ZeroMQ的高性能分布式RPC框架
12、Bottle: 微型Python Web框架
13、Tornado:异步非阻塞IO的Python Web框架,Tornado框架的基本组成
14、webpy: 轻量级的Python Web框架
15、Scrapy:Python的爬虫框架
想了解具体框架详情,请跳转:Python框架
二、了解Flask框架(轻量级Web应用框架)
Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。 Flask使用BSD授权。 Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。
Flask框架目录:
```
flask-demo/├ run.py # 应用启动程序 ├ config.py # 环境配置 ├ requirements.txt # 列出应用程序依赖的所有Python包 ├ tests/# 测试代码包 │ ├ __init__.py │ └ test_*.py # 测试用例 └ myapp/├ admin/# 蓝图目录 ├static/│ ├ css/# css文件目录 │ ├ img/# 图片文件目录 │ └ js/# js文件目录 ├ templates/# 模板文件目录 ├ __init__.py ├ forms.py # 存放所有表单,如果多,将其变为一个包 ├ models.py # 存放所有数据模型,如果多,将其变为一个包 └ views.py # 存放所有视图函数,如果多,将其变为一个包
```
Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。
Flask扩展包:
Flask-SQLalchemy:操作数据库;
Flask-migrate:管理迁移数据库;
Flask-Mail:邮件;
Flask-WTF:表单;
Flask-script:插入脚本;
Flask-Login:认证用户状态;
Flask-RESTful:开发REST API的工具;
Flask-Bootstrap:集成前端Twitter Bootstrap框架;
Flask-Moment:本地化日期和时间;
欢迎使用Flask(中文文档),welcome to use flask
Flask程序运行过程:
所有Flask程序必须有一个程序实例。
Flask调用视图函数后,会将视图函数的返回值作为响应的内容,返回给客户端。一般情况下,响应内容主要是字符串和状态码。
用户向浏览器发送http请求,web服务器把客户端所有请求交给Flask程序实例,程序用Werkzeug来做路由分发,每个url请求,找到具体的视图函数。路由的实现是通过route装饰器实现的,调用视图函数,获取数据后,把数据传入模块中,模块引擎渲染响应的数据,由Flask返回给浏览器。
模板的基本语法:
通过修改一下前面的示例,来学习下模板的简单使用:
Flask数据库:
Web应用中普遍使用的是关系模型的数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的。它使用结构化的查询语言。关系型数据库的列定义了表中表示的实体的数据属性。比如:商品表里有name、price、number等。
Flask本身不限定数据库的选择,你可以选择SQL或NOSQL的任何一种。也可以选择更方便的SQLALchemy,类似于Django的ORM。SQLALchemy实际上是对数据库的抽象,让开发者不用直接和数据库打交道,而是通过Python对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升。
SQLALchemy是一个关系型数据库框架,它提供了高层的ORM和底层的原生数据库的操作。flask-sqlalchemy是一个简化了SQLALchemy操作的flask扩展。
非常详细的安装介绍:Python Flask Web 框架入门
三、了解Tornado框架(异步非阻塞IO的Python Web框架)
Tornado(龙卷风)和Django一样是Python中比较主流的web框架,Tornado 和现在的主流 Web 服务器框架也有着明显的区别:Tornado自带socket,并且实现了异步非阻塞并对WebSocket协议天然支持;、
Tonado由路由系统、视图、静态文件、模板语言4大部分组成。
Tornado有2大特色:原生支持WebSocket协议、异步非阻塞的Web框架
1、WebSocket协议
HTTP和WebSocket协议都是基于TCP协议的,不同于HTTP协议的是WebSocket和服务端建立是长连接且连接成功之后,会创建一个全双工通道,这时服务端可以向客户端推送消息,客户端也可以向服务端推送消息,其本质是保持TCP连接,在浏览器和服务端通过Socket进行通信,由于WebSocket协议建立的是双向全双工通道,所以客户端(浏览器)和服务端(Web框架)双方都要支持WebSocket协议,Tornado原生支持这种协议;
2、异步非阻塞介绍
Web框架分阻塞式和异步非阻塞2种;
2.1.阻塞式IO(Django、Flask、Bottle)
大多数的Web框架都是阻塞式的,体现在1个请求到达服务端如果服务端未处理完该请求,后续请求一直等待;
解决方案:
开启多线程/多进程:多个线程提高并发;
缺点:浪费系统资源
2.2、Tornado异步非阻塞(Tornado/NodeJS)
异步非阻塞就是在服务端结合IO多路复用select/poll/epoll模板,做到1个线程在遇到IO操作的情况下,还可以做一些其他的任务;Tornado默认是阻塞的同时也支持异步非阻塞功能;
Tornado异步非阻塞=IO多路复用(循环检查socket是否发生变化)+携程(哪个有变化?就切换到那个socket!)
1.客户端发送请求如果请求内容不涉及IO操作(连接数据、还得去其他网站获取内容)服务端直接响应客户端;
2.如果请求内容涉及IO操作,服务端把本次连接的socket信息添加到socket监听列表中监听起来;
然后去连接其它socket(数据库、其它站点)由于是不阻塞的所以服务端把这次发送socket信息也监听起来;(一直循环监听,直到socket监听列表中的socket发生变化)
3.把socket全部监听之后,就可以去继续接收其它请求了,如果检测到socket监听列表中的socket有变化(有数据返回),找到对应socket响应数据,并从socket监听列表中剔除;
3、Tornado Web服务
TensorFlow模型的计算图,一般输入的类型都是张量,你需要提前把你的图像、文本或者其它数据先进行预处理,转换成张量才能输入到模型当中。而一般来说,这个数据预处理过程不会写进计算图里面,因此当你想使用TensorFlow Serving的时候,需要在客户端上写一大堆数据预处理代码,然后把张量通过gRPC发送到serving,最后接收结果。现实情况是你不可能要求每一个用户都要写一大堆预处理和后处理代码,用户只需使用简单POST一个请求,然后接收最终结果即可。因此,这些预处理和后处理代码必须由一个“中间人”来处理,这个“中间人”就是Web服务。
我们使用Tornado框架来搭建我们的Web服务,Tornado是一个支持异步非阻塞的高性能Web框架,可以接收多个用户的并发请求,然后向TensorFlow Serving并发请求结果,并在其中承担所有的数据预处理、后处理任务。