Flask 项目打包 线上部署

简介: Flask 项目打包 线上部署

本文涉及的相关技术:flask + gunicorn + gevent+ docker


图床简介


前端时间小牛不是写了个自用的图床,最近有闲暇的时候,迭代了一下,准备打包到服务器上


迭代内容是:之前只能从固定的文件夹中去读取图片,感觉太麻烦了,小牛在公司还用不了;目前还支持了 点击、拖拽、复制粘贴上传图片,并将本地的服务打包到服务器中,随时随地使用网页版图床


Flask代码


前期准备:flask+gevent+gunicorn 相关依赖都已安装好


#app.py


from flask import Flask


app = Flask(__name__)


@app.route('/')

def hello():

   return 'hello docker&flask'


if __name__ == '__main__':

   app.run(host='0.0.0.0')


因为举例子,所以项目没有采用blueprint 的方式去构建


python start.py 即可运行项目


host='0.0.0.0' 是因为笔者想在公网环境中访问,这样项目的路径ip就是当前服务主机的ip,不写的话只能通过127.0.0.1调用。


一般还有其他2种启动方式:


python -m flask run -p 8088 -h 127.0.0.2,这种可以指定项目启动时的ip和端口


flask run -p 8088 -h 127.0.0.2 纯flask启动,但作用和上面一种一样


上述启动方式,平时我们测试开发使用足以,但我们的程序一般得部署到服务器上,这样可就不够看了,我们要寻求更长久的真正的部署。这时 gevent+gunicorn的作用就来了


Gunicorn ||  gevent


Gunicorn: 是一个 UNIX 下的 WSGI HTTP 服务器 ,Flask应用是一个符合WSGI规范的Python应用,不能独立运行(类似app.run的方式仅适合开发模式), 处理高并发有所欠缺,需要依赖其他的组件提供服务器功能。通过优化 Gunicorn 配置提高性能


gevent:gevent一般搭配gunicorn来部署。gunicorn 默认使用同步阻塞的网络模型(-k sync),对于大并发的访问可能表现不够好,需要套一个gevent来增加并发量


docker: 近几年非常火的开源项目,核心功能容器,能够让开发者打包我们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。


容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。将项目与环境进行隔离


Flask部署关系图如下:


image.png


编写gunicorn配置文件


gunicorn.conf.py文件


sudo vim gunicorn.conf.py


添加代码:


workers = 5

worker_class = "gevent"

bind = "0.0.0.0:8080"


导出依赖


在app.py同级目录执行即可,将当前python环境的依赖全部写入requirements.txt 文件中,我们构建容器时,会去读取依赖配置


pip freeze > requirements.txt


编写dockerfile文件


这是最核心,也最容易出错的地方,笔者这边用的是最简单的写法,作为例子引入。详情可取查看官方文档


sudo vim Dockerfile  #创建文件


FROM python:3

MAINTAINER xiaoniuhululu

COPY requirements.txt ./

EXPOSE 5000

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["gunicorn", "app:app", "-c", "./gunicorn.conf.py"]


简单解释一下参数:
FROM   # 指明我们创建的镜像,所依赖的基础镜像,我们这边是python3


MAINTAINER  # 维护者信息


如果觉得文章对你有帮助,欢迎关注微信公众号:小牛呼噜噜


COPY  # 将宿主机的文件cp到创建的镜像当前路径下


EXPOSE ## 仅仅只是声明端口。
帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口


RUN  # 你需要在创建镜像之前,需要执行的命令


CMD  # 创建容器后执行的第一个命令,一般是启动命令


定制镜像


上述的步骤 无论你是在windows环境 还是linux都可以,但接下来我们后续步骤在服务器环境(linux,不太建议用windows服务器 太浪费资源了)中操作


在当前目录下 有dockerfile执行命令
docker build -t upload-picture-flask . //-t 镜像的名字及标签, . 表示 在当前目录下寻找dockerfile


image.png

然后倒杯咖啡,慢慢的等待,因为制作镜像的过程需要联网下载大量的包,非常耗时,说个小技巧如果你的项目所需的依赖非常大,很看网速,容易失败,这个时候你可以去下一个对应的docker镜像到本地,然后在dockerfile添加from docker-你需要的镜像,就是将这个依赖作为多个基础镜像 定制你的项目镜像


image.png

查看生成的镜像


docker images


image.png

以守护程序创建并启动容器


docker run -d -p 5000:5000 --name flaskUploadPicture upload-picture-flask:latest


-p容器内外端口映射


--name flaskUploadPicture 指定别名


upload-picture-flask:latest 所依赖的镜像,即我们刚刚生成的


(复制命令容易出错,请手打命令)


查看所有容器运行状态:


docker ps -a


效果


如果不行的话,检查外部映射的端口服务器防火墙 是否放开


如果还是不行的话,我们以下操作来核实原因


docker logs 容器id 查看docker日志


docker exec -it 容器id /bin/bash 进入镜像内部


图床最终效果图:


image.png



本篇文章到这里就结束啦,如果喜欢的话,多多支持,欢迎关注!

相关文章
|
6月前
|
缓存 前端开发 JavaScript
flask各种版本的项目,终端命令运行方式的实现
flask各种版本的项目,终端命令运行方式的实现
276 4
|
6月前
|
数据可视化 API 开发者
通俗易懂:一步步教你 Flask 项目自动生成 API 文档
Flasgger,作为一款强大的 Flask 扩展,自动从 Flask 应用中提取并生成 OpenAPI 规范文档,配备 SwaggerUI,为开发者提供了一条快捷通道,让 API 的文档编制和交互式测试变得简单易行。Flasgger 的设计原则是简化开发流程,通过与 Flask 框架的无缝整合,让开发者可以更专注于应用逻辑的构建。
|
11月前
|
XML 应用服务中间件 Linux
在一个centos服务器上同时部署tomcat,django,flask
在一个centos服务器上同时部署tomcat,django,flask
121 0
|
前端开发 JavaScript Python
flask 项目目录结构
flask 项目目录结构
165 0
|
3月前
|
存储 Linux 开发工具
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
【Azure App Service】本地Git部署Python Flask应用上云(Azure App Service For Linux)关键错误
|
3月前
|
Ubuntu Apache Python
如何在 Ubuntu VPS 上部署 Flask 应用程序
如何在 Ubuntu VPS 上部署 Flask 应用程序
33 1
|
3月前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
|
3月前
|
Python Windows 内存技术
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
【Azure 应用服务】Azure App Service (Windows) 使用Flask框架部署Python应用,如何在代码中访问静态文件呢?如何设置文件路径?是相对路径还是绝对路径呢?
|
4月前
|
安全 前端开发 API
震惊!掌握Django/Flask后,我竟然轻松征服了所有Web项目难题!
【7月更文挑战第15天】Python Web开发中,Django以其全面功能见长,如ORM、模板引擎,助你驾驭复杂需求;Flask则以轻量灵活取胜,适合快速迭代。两者结合使用,无论是数据库操作、用户认证还是API开发,都能让你应对Web挑战游刃有余。掌握这两者,Web项目难题变得易如反掌!
75 10
|
5月前
|
数据处理 Python
Flask 项目工程目录层级划分
本文介绍了如何将 Flask 项目工程目录层级按照主题分类划分,主要包括模型层、视图层、表单层、模板文件和静态文件。通过合理地组织项目文件,可以提高项目的可读性、可维护性和可扩展性。
85 5