【Python】FastAPI 项目创建 与 Docker 部署

文章目录

  • 前言&需求描述
  • 1. 本地FastAPI
    • 1.1 Python 环境准备
    • 1.2 本地 Pycharm 创建FastAPI项目
  • 2. Python FastAPI 部署
    • 2.1 服务器配置Python环境
      • 2.2.1 下载与配置Git、Pyenv等工具
      • 2.2.2 下载与配置Python
    • 2.2 FastAPI 打包成镜像
      • 2.2.1 项目准备所需环境文件
      • 2.2.2 编写Docker File
      • 2.2.3 服务器拉取代码
      • 2.2.4 制作镜像
    • 2.3 Docker 挂载
  • 3. 补充与总结
    • 3.1 补充: Swagger ui 显示问题
    • 3.2 pyenv常用命令及下载过慢问题
    • 3.2 总结
  • 4. 唠嗑
    • 4.1 为啥一上来就是项目
    • 4.2 为啥没写东西就开始部署
  • 参考资料

来自JAVA程序猿对Python fastapi 的探索

前言&需求描述

需求描述

  • 构建 Python 环境与服务
  • 创建 Python 项目,部署到服务器上,能以Web的方式访问

需求目标
当前阶段不需要马上实现若干功能,直接创建FastAPI项目,输出Hello World, 并能通过Web访问即可。

学习目标

  • 基于Java技术栈的基础,拐弯学习Python FastAPI如何使用,第一步是要将Python FastAPI在本地可用。
  • 创建远程仓库用于保存代码,方便日后接着开发。
  • 将FastAPI项目部署到服务器,浏览器访问。

1. 本地FastAPI

现学现用!

1.1 Python 环境准备

时间关系,这里就不赘述了。2024年初,我记得我2023年时曾经试过2022年收藏过的优秀博主JackCui于2021年发布的教程里的Python环境准备。抱着试一试的态度,cmd下执行python --version:

C:\Users\97635>python --version
Python 3.9.7

成功显示当前我的python版本为3.9.7。说明我本地已经OK了。

如果是初学或想参考的读者,可参阅下面链接记述的配置方式:
jackcui-Anaconda+Vscode链接

参考链接的文章来自JackCui,一位非常优秀的技术博主,我是他的粉丝。

1.2 本地 Pycharm 创建FastAPI项目

对着文末的B站优秀教程,现学现用,直接开始。

创建项目
参照下图,创建fast api项目:
1

参考如图所示,填写项目信息,路径,python 解释器等。

编辑启动
之后,我们在 main.py 得到如下代码:

from fastapi import FastAPIapp = FastAPI()@app.get("/")
async def root():return {"message": "Hello World"}@app.get("/hello/{name}")
async def say_hello(name: str):return {"message": f"Hello {name}"}

看起来像Java一开始给了咱 Hello World 启动类一样,但是有所不同的是,我们需要写一个启动方法方便启动:

import uvicornif __name__ == "__main__":uvicorn.run("main:app", host="0.0.0.0", port=8080)

为什么这么写,先不管,但至少我们能读懂:启动端口是8080嘛,经典!

启动项目
如下图所示,点击启动:
2

有 Java Web 的基础,我们可以直接地址访问:
http://localhost:8080/

出现{"message":"Hello World"}说明成功

2. Python FastAPI 部署

以前只懂Java部署,会一点Docker部署。现在要部署FastAPI项目咯。

2.1 服务器配置Python环境

第一步,服务器要有相应的Python环境。

检查服务器python版本

python --version

一般情况下,很多LinuxOS都自带了python,因此我这里:

[root@iZwz99y2tt0dh6vqymy7e6Z ~]# python --version
Python 2.7.5

发现当前服务器的 python 版本与我们所需的3.9.x不一致,此时我们需要用一些管理工具来管理服务器 python 版本。

配置git
我们想执行curl https://pyenv.run | bash来使用pyenv 工具管理服务器 python。但贸然执行这句,若服务器无git,会报:
pyenv: Git is not installed, can't continue.
因此还需要一个前置工作,在服务器上配置git

2.2.1 下载与配置Git、Pyenv等工具

检查git

git –version

出现以下则说明要先下载git

[root@iZwz99y2tt0dh6vqymy7e6Z ~]# git –version
-bash: git: command not found

yum下载git

yum -y install git

git 配置
依次配置用户名、邮箱、编辑器,

git config --listgit config --global user.name usernamegit config --global user.email email@email.com

生成SSH key 并获取

ssh-keygen -t rsa -C "email@email.com"

如果没有指定SSH key目录,root 下 默认在

/root/.ssh/id_rsa.pub

下载pyenv
如果服务器用了魔法,或者网络环境非常非常好,使用:
curl https://pyenv.run | bash下载 pyenv python 版本管理工具即可。

但一般情况下,懂的都懂,需要想别的方案, 例如,参考文末的参考文章,依次执行:

  • 环境依赖相关
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel liblzma-devel
  • git 克隆:
git clone --depth 1 https://github.com/pyenv/pyenv.git /usr/local/.pyenv
  • vim 编辑 /etc/profile
# for pyenv
export PYENV_ROOT="/usr/local/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
  • 让命令生效
source /etc/profile

2.2.2 下载与配置Python

有了pyenv,执行

pyenv install <version>

下载过慢或下载失败解决方案,下文的补充章节会提到。

2.2 FastAPI 打包成镜像

2.2.1 项目准备所需环境文件

由于这是初始化项目,只需要fastapi[all](新手友好,方便)即可,因此,requirements.txt 文件只需要:

fastapi[all]

2.2.2 编写Docker File

FROM python:3.9.7# 设置工作目录
WORKDIR /home# 复制项目文件到工作目录
COPY . .# 安装项目依赖
RUN pip install --no-cache-dir -r requirements.txt# 对外暴露的端口号
EXPOSE 18082# 启动 FastAPI 应用
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "18082"]

2.2.3 服务器拉取代码

既然在上一小节都下载了git了,那么索性创建仓库,上传代码,再从服务器上将代码拉下拉吧。

git clone <url>

2.2.4 制作镜像

服务器进入项目目录,执行docker build

docker build -t <image_name> .

注意实际执行时将镜像名称换成自己的,之后,等待build即可。

2.3 Docker 挂载

我们本地刚刚 build 的 image 并未上传到docker hub,属于本地image,因此我们直接执行docker run命令即可在服务器跑起来:

docker run -d --name <name> -p 8000:8000 <image_name> 

3

浏览器访问,完成!

3. 补充与总结

3.1 补充: Swagger ui 显示问题

通常,由于fastapi自带的Swagger ui相关js是由国外CDN加载进来的,本地Swagger无法正确显示是十分正常的现象。因此国内很多大佬都出了解决方案教程,我参考的是博客园-fastapi Swagger无法正确显示解决方案

CV一通大佬的代码之后,访问http://localhost:8080/docs,Swagger 3 成功显示:
4

main.py整体代码

import uvicorn
from fastapi import FastAPI, applications
from fastapi.openapi.docs import get_swagger_ui_htmldef swagger_monkey_patch(*args, **kwargs):"""fastapi的swagger ui默认使用国外cdn, 所以导致文档打不开, 需要对相应方法做替换在应用生效前, 对swagger ui html做替换:param args::param kwargs::return:"""return get_swagger_ui_html(*args, **kwargs,swagger_js_url='https://cdn.staticfile.org/swagger-ui/4.15.5/swagger-ui-bundle.min.js',  # 改用国内cdnswagger_css_url='https://cdn.staticfile.org/swagger-ui/4.15.5/swagger-ui.min.css')applications.get_swagger_ui_html = swagger_monkey_patchapp = FastAPI()# 指定Swagger 版本为3.0.0
app.openapi_version = "3.0.0"@app.get("/")
async def root():return {"message": "Hello World"}@app.get("/hello/{name}")
async def say_hello(name: str):return {"message": f"Hello {name}"}if __name__ == "__main__":uvicorn.run("main:app", host="0.0.0.0", port=8080)

3.2 pyenv常用命令及下载过慢问题

常用命令

pyenv versions # 显示所有已经安装的python版本
pyenv version # 显示当前设置的python版本
pyenv install --list # 显示可以安装的python版本
pyenv install <version> # 安装<version>版本的python
pyenv global <version> # 设置全局状态的python版本
pyenv local <version> # 设置当前目录(或其子目录)下的python的版本
pyenv shell <version> # 仅为当前shell会话选择
pyenv uninstall <version> # 卸载<version>版本的python

下载过慢解决方案
在下文的参考文章里,大佬们已经总结过解决方案。但我觉得这是很多像我一样的新手也会遇到的问题。

我们在服务器pyenv的项目根目录下创建一个cache文件夹,然后在python官网下载指定python.tar.xz文件手动上传到服务器

Python官网gzip包下载路径

3.2 总结

本文,通过一个实际需求的契机,我们完成了这几件件小白也可以直接开干的事:Python 环境配置(主要是服务器)+ Fast API 创建 + 部署。现在来总结一些小重点:

  • 本地创建Fast API项目 :首先要有本地 Python 解释器,本地先用Python解释器执行pip install 命令下载Fast API 所需依赖,接着,使用集成工具创建Fast API 项目。
  • 创建项目后,需要测试本地运行,以及内置swagger显示。
  • 服务器 Python 环境配置。使用 pyenv 工具来管理服务器python版本。
  • Docker 部署:DockerFile 、 Docker 命令。

4. 唠嗑

4.1 为啥一上来就是项目

别的教程一开始都是语法hello world噻,况且我是python小白,为啥你这一上来就是项目?是的,我确实是python小白,语法都没完全掌握。但需求是直接构建一个基于Python 的 Web服务,便于功能独立与后续开发,作为Java服务端程序猿,日常与Web打交道比较多,应该能触类旁通吧。于是我在没什么Python语法与技术栈的基础上直接开始了项目。

4.2 为啥没写东西就开始部署

为了先跑通流程。毕竟咱从隔壁JAVA跑过来,还没正儿八经部署过python项目。那么既然有需要,先整一遍创建-部署流程还是很有必要的,方便日后开发部署,甚至进行CI/CD。因此第一时间部署一遍,熟悉Python项目部署流程(主要是DockerFile的编写与服务器环境配置),日后更分支,部署就方便多了。

参考资料

  • jackcui-Anaconda+Vscode
  • Pycharm下载链接
  • 博客园-fastapi Swagger无法正确显示解决方案
  • CSDN-服务器pyenv配置优秀参考文章1
  • CSDN-服务器pyenv配置优秀参考文章2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710802.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI智能分析网关V4车辆违停算法在园区场景中的应用及特点

随着城市化进程的加速&#xff0c;车辆违停问题愈发严重&#xff0c;给城市交通带来了极大的困扰。为了解决这一问题&#xff0c;AI技术逐渐被应用于车辆违停的检测中。AI检测算法在车辆违停方面的应用&#xff0c;主要是通过计算机视觉技术&#xff0c;对道路上的车辆进行实时…

智慧灌区项目案例(甘肃省兰州市某重点灌区)

​甘肃省兰州市某重点灌区自上个世纪80年代建成后,灌溉面积达到30万亩,对推动当地农业发展发挥了重要作用。但长期以来,该灌区的水利管理仍主要依靠人工统计记录,缺乏实时监测和精细化管理。为实现灌区管理的现代化升级,甘肃水利局委托星创易联公司设计实施水利信息化项目。 项…

【Python笔记-设计模式】状态模式

一、说明 状态模式是一种行为设计模式&#xff0c;用于解决对象在不同状态下具有不同行为 (一) 解决问题 在对象行为根据对象状态而改变时&#xff0c;规避使用大量的条件语句来判断对象的状态&#xff0c;提高系统可维护性 (二) 使用场景 当对象的行为取决于其状态&#…

C#使用iText7将多个PDF文档合并为单个文档

使用HtmlAgilityPack抓取并分析网页内容&#xff0c;然后再调用PuppeteerSharp将网页生成PDF文件&#xff0c;最终的成果如下图所示&#xff0c;得到将近120个pdf文档。能看&#xff0c;但是不方便&#xff0c;需要逐个打开文档才能看到所需的内容&#xff0c;最好能将这些文档…

浅谈 Linux 网络编程 socket

文章目录 socket 介绍 socket 介绍 socket 被翻译成 网络套接字&#xff0c;这个名字实在是不好理解&#xff0c;我更愿意称为"插槽"。 忽略 socket 的中文名&#xff0c;先无脑记住两个规则&#xff1a; ① 记住&#xff0c;一个文件描述符(fd) 指向一个 socket&…

GPT-SoVITS音色克隆-模型训练步骤

GPT-SoVITS音色克隆-模型训练步骤 GPT-SoVITS模型源码一个简单的TTS后端项目 基于模型部署和训练教程&#xff0c;语雀 模型部署和训练教程 启动模型训练的主页面 1. 切到模型路径 /psycheEpic/GPT-SoVITS进入Python虚拟环境&#xff0c;并挂起执行python脚本 conda activ…

机器学习(II)--样本不平衡

现实中&#xff0c;样本&#xff08;类别&#xff09;样本不平衡&#xff08;class-imbalance&#xff09;是一种常见的现象&#xff0c;如&#xff1a;金融欺诈交易检测&#xff0c;欺诈交易的订单样本通常是占总交易数量的极少部分&#xff0c;而且对于有些任务而言少数样本更…

Linux信号【产生-保存-处理】

目录 前言&#xff1a; 1、进程信号基本概念 1.1、什么是信号&#xff1f; 1.2、信号的作用 2、键盘键入 2.1、ctrlc 终止前台进程 2.1.1、signal 注册执行动作 3、系统调用 3.1、kill 函数 3.2、模拟实现 myKill 3.3、raise 函数 3.4、abort 函数 4、软件条件信号…

人工智能福利站,初识人工智能,图神经网络学习,第五课

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

nginx设置缓存时间、日志分割、开启多进程、网页压缩、配置防盗链

一、设置缓存时间 当网页数据返回给客户端后&#xff0c;可针对静态网页设置缓存时间&#xff0c;在配置文件内的http段内server段添加location&#xff0c;更改字段expires 1d来实现&#xff1a;避免重复请求&#xff0c;加快访问速度 第一步&#xff1a;修改主配置文件 #修…

Vulnhub靶机:basic_pentesting_2

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.4&#xff09; 靶机&#xff1a;basic_pentesting_2&#xff08;10.0.2.7&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.c…

如何选择O2OA(翱途)开发平台的部署架构?

概述 O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]支持公有云&#xff0c;私有云和混合云部署&#xff0c;也支持复杂的网络结构下的分布式部署。本篇主要介绍O2OA(翱途)开发平台支持的部署环境以及常用的集群部署架构。 软硬件环境说明 支持的云化平台&#xff1a; 华为云…

LLM 聊天对话界面chatwebui 增加实时语音tts功能

类似豆包聊天,可以实时语音回复 1、聊天界面 streamlit页面 参考界面:https://blog.csdn.net/weixin_42357472/article/details/133199866 stream_web.py 2、 增加实时语音tts功能(接入melotts api服务) 参考:https://blog.csdn.net/weixin_42357472/article/detai…

Docker容器与虚拟化技术:OpenEuler 使用 docker-compose 部署 LNMP

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose 3.docker-compose 部署 LNMP 二、问题 1.ntpdate未找到命令 2.timedatectl 如何设置时区与时间同步 3.php网页显示时区不对 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注Lin…

厚膜电阻与薄膜电阻相比,特点是什么?

厚膜电阻与薄膜电阻是两种常见的电阻器件&#xff0c;它们之间的特点主要有以下几个方面&#xff1a; 1. 厚度不同&#xff1a;厚膜电阻的膜层厚度较大&#xff0c;一般在几微米到几十微米之间&#xff0c;而薄膜电阻的膜层厚度较薄&#xff0c;一般在几纳米到几微米之间。 2. …

单片机精进之路-9ds18b20温度传感器

ds18b20复位时序图&#xff0c;先将b20的数据引脚拉低至少480us&#xff0c;然后再将数据引脚拉高15-60us&#xff0c;再去将测传感器的数据引脚是不是变低电平并保持60-240us&#xff0c;如果是&#xff0c;则说明检测到温度传感器&#xff0c;并正常工作。需要在240us后才能检…

xss高级靶场

一、环境 XSS Game - Ma Spaghet! | PwnFunction 二、开始闯关 第一关 看看代码 试一下直接写 明显进来了为什么不执行看看官方文档吧 你不执行那我就更改单标签去使用呗 ?somebody<img%20src1%20onerror"alert(1)"> 防御&#xff1a; innerText 第二关…

Python图像形态学处理:腐蚀、膨胀、礼帽、黑帽……

文章目录 二值形态学灰度形态学 python图像处理教程&#xff1a;初步&#x1f4f7;插值变换 最基础的形态学操作有四个&#xff0c;分别是腐蚀、膨胀、开计算和闭计算&#xff0c;【scipy.ndimage】分别实现了二值数组和灰度数组的这四种运算。而针对灰度图像&#xff0c;【sc…

Office/WPS 好用的PPT插件-智能选择布局

软件介绍 PPT大珩助手是一款全新设计的Office PPT插件&#xff0c;它是一款功能强大且实用的PPT辅助工具&#xff0c;能够轻松帮助您修改、优化和管理幻灯片。凭借丰富的功能和用户友好的界面&#xff0c;PPT大珩助手能够助力您打造出精美而专业的演示文稿。我们致力于为用户提…

NGINX的重写与反向代理机制解析

目录 引言 一、重写功能 &#xff08;一&#xff09;if指令 1.判断访问使用的协议 2.判断文件 &#xff08;二&#xff09;return指令 1.设置返回状态码 2.返回指定内容 3.指定URL &#xff08;三&#xff09;set指令 1.手动输入变量值 2.调用其它变量值为自定义变…