Python中使用Flask
机器学习离不开Python,那么必不可少的的我们回用到Python中的一些web api框架,Python中的web框架很多,使用量大,轻量级的那么flask当之无愧(随便搜了一下,大家都说它好,就用了)。
在从零点一开始机器学习之HDF5模型发布到tensorflow/serving中,我们也发布了我们的模型,那么如果将模型更好的给第三方人员使用呢?在进行验证的时候,如果要做一定的前期处理又在哪个模块中进行呢?那么我们就看本文就好了。
系列文章目录
Python中使用Flask:VsCode调试Flask程序
Python中使用Flask:Flask Web入门实操
Python中使用Flask:Docker发布Flask API
Python中使用Flask:Docker发布Flask API
文章目录
- Python中使用Flask
* - Python中使用Flask:Docker发布Flask API
- 前言
- 一、flask项目架构
* - 1.整体项目架构
- 二、承载服务
* - 1.安装gunicorn 和gevent
- 2.创建gunicorn配置
- 二、docker环境准备
- 三、开始发布
- 四、BUG处理
*
–- 1.docker启动flask容器报错: ImportError: cannot import name app
- 2.Centos 容器启动 ImportError: libGL.so.1: cannot open shared object file: No such file or dir报错,含有opencv依赖
- 3.docker启动flask容器报错: ImportError: cannot import name app
- 4.Address already in use
- 5.gunicorn HaltServer: 「HaltServer ‘Worker failed to boot.’ 3」
- 6.蓝图不能返回静态文件
- 5代码
- 总结
*
–
前言
本文主要是基于docker 运行flaskapi,主要是对外提供二次图像分类接口,进行图像预处理,flask 后台调用基于TensorFlow Serving的分类模型API
环境说明 环境和版本很重要,大量的博客没有环境说明和版本介绍,对新人很不友好
开发环境:
系统版本:Win7
Python版本:Python3.6
tensorflow版本:tensorflow-cpu 2.6.0
发布环境:
系统版本:CentOS Linux release 7.8.2003 (Core)
tensorflow/serving版本:最新cpu版本(latest版本)
docker版本:Docker version 19.03.12, build 48a66213fe
一、flask项目架构
1.整体项目架构
很多小伙伴刚接触这个flask框架很多地方都不熟悉,绕来绕去的,成功发版踩坑很多,本来就是几个简单的接口。结果弄一大堆大学,实力劝退!
图中架构包含了fask基本框架,蓝图使用,gunicorn的简单配置等
wwxcwebcopy:.
│ 1.txt
│ dockerfile
│ gunicorn.conf.py
│ requirements.txt
│ requirements__.txt
│ start.py
│ start_local.py
│
├─.vscode
│ launch.json
│ settings.json
│
├─wwxcweb
│ │ fileupload.py
│ │ returnhtml.py
│ │ __init__.py
│ │
│ ├─model 模型存放文件
│ ├─static
│ │ │ index.html
│ │ │
│ │ └─uploads
│ └─__pycache__
└─__pycache__
注意,一定不要使用上一篇博客或者flask中文网中大型应用作为一个包
中的项目框架,这样会产生循环调用,在启动docker时报错!大坑(第一次见官方文档挂一个错误的使用方式来方便大家理解和入门的)而且还在问中明确的描述出这个错误。还说不影响使用!我信你个鬼!
; 二、承载服务
greenlet是一个轻量级的协程库。gevent是基于greenlet的网络库。
guincorn是支持wsgi协议的http server,gevent只是它支持的模式之一 ,是为了解决django、flask这些web框架自带wsgi server性能低下的问题。它的特点是与各个web框架结合紧密,部署特别方便。
总结理解一下就是guincorn是一个性能好一点的web服务壳子,支持以gevent方式进行工作,我们不直接 发布flask,而是用guincorn来承载flaskapp。
1.安装gunicorn 和gevent
pip install gunicorn gevent
安装完成后 pip list查看效果,果然安装了依赖库greenlet
2.创建gunicorn配置
在项目根目录创建 /gunicorn.conf.py
workers = 17
worker_class = "gevent"
bind = "0.0.0.0:7077"
我们可以使用gunicorn命令来测试是否可以正确运行,打开网址127.0.0.1:7077,将会打开我们的网站。
gunicorn start:app -c gunicorn.conf.py
注意 Windows下运行会报错!
报错为No module named ‘fcntl’,新建一个 fcntl. py.文件,将其存放 Python的安装目录 Python36/Lib下
接下来还会报错缺少No module named ‘pwd’ ,到这个地方为止吧,等会直接干掉服务器上去,有bug慢慢来在解决,反正项目代码很少,应该没有bug吧!
二、docker环境准备
根目录下创建dockerfile文件
FROM python:3.6
WORKDIR /var/wf/
COPY requirements.txt ./
RUN pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
COPY . .
EXPOSE 7077
CMD ["gunicorn", "start:app", "-c", "./gunicorn.conf.py"]
三、开始发布
才home/llp/目录下 新建wf文件夹,将步骤1中wwxcwebcopy目录下的全部文件copy到wf中
[root@ecs-photo ~]
[root@ecs-photo wf]
1.txt dockerfile gunicorn.conf.py __pycache__ requirements__.txt requirements.txt start_local.py start.py wwxcweb
在该文件中构建镜像 注意有个点
docker build -t "wf" .
构建成功后,在docker中启动一个对应的容器。构建过程部分截图
启动容器命令 配置文件挂载可以按照需要省略
docker run -di --name=wbc9511 -v /home/llpcode/wb9511docker/config.ini:/var/wf/flaskweb/config.ini -p 9511:7077 wf &
postman测试一下
收工!
四、BUG处理
1.docker启动flask容器报错: ImportError: cannot import name app
不要在flask代码中产生循环依赖否则会报错,此处建议使用蓝图解决
注意,一定不要使用上一篇博客或者flask中文网中大型应用作为一个包中的代码结构!入门劝退型文档!
网上搜索出来的方案大部分都是ubuntu16.04下的解决方案,apt-get install -y libgl1-mesa-glx apt安装对应的库,但是在centos中个人感觉姿势不对,尝试了很久,不能成功,在安装更新过程中总是卡死。后来了解到是requirements.txt中引用了opencv-python依赖包的原因,需要将opencv-python替换为opencv-python-headless即可解决,也就是说只需要一个opencv-python-headless就ok了,其他的OpenCV相关包都不需要。
3.docker启动flask容器报错: ImportError: cannot import name app
不要在flask代码中产生循环依赖否则会报错,此处建议使用蓝图解决
注意,一定不要使用上一篇博客或者flask中文网中大型应用作为一个包中的代码结构!入门劝退型文档!
4.Address already in use
在容器启动日志中可以看到有一个http://127.0.0.1:5000启动成功的日志,原来是启动了2次,falsk本身启动了一次,gunicorn又启动了一次.
start.py文件中去掉 app.run(threaded=True)代码
5.gunicorn HaltServer: 「HaltServer ‘Worker failed to boot.’ 3」
在start.py中添加gunicorn,gevent依赖
install_requires=[
"Flask",
"gevent",
"gunicorn",
],
6.蓝图不能返回静态文件
蓝图的第三个参数是 static_folder 。这个参数用以指定蓝图的静态文件所在的 文件夹,它可以是一个绝对路径也可以是相对路径。:也就是需要手动指定静态文件夹
admin = Blueprint(‘admin’, name, static_folder=’static’)
5代码
阿里云盘测试 https://www.aliyundrive.com/s/6ncBymvm87Z
总结
文中发布方式为最基础的发布方式,没有继承持续构建和自动化构建。镜像也没有上传到容器仓库。如果需要进一步优化发布流程,参考博主docker专栏
博客review计划
由于以前很多时候是为了记录一下笔记,有的是为了活动啊之类的,导致很多博客环境不全,代码不全,排版混乱,专栏分类不清楚,所以在开始写新的博客直接,开启review计划。
review:20220820
Original: https://blog.csdn.net/l1158513573/article/details/122623309
Author: 小黄瓜要编程
Title: Python中使用Flask:Docker发布Flask API
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/747307/
转载文章受原作者版权保护。转载请注明原作者出处!