文章目录
- 前言&需求描述
- 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项目:
参考如图所示,填写项目信息,路径,python 解释器等。
编辑启动
之后,我们在 main.py 得到如下代码:
from fastapi import FastAPI
app = 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 uvicorn
if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8080)
为什么这么写,先不管,但至少我们能读懂:启动端口是8080嘛,经典!
启动项目
如下图所示,点击启动:
有 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 --list
git config --global user.name username
git 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.1 补充: Swagger ui 显示问题
通常,由于fastapi自带的Swagger ui相关js是由国外CDN加载进来的,本地Swagger无法正确显示是十分正常的现象。因此国内很多大佬都出了解决方案教程,我参考的是博客园-fastapi Swagger无法正确显示解决方案
CV一通大佬的代码之后,访问http://localhost:8080/docs
,Swagger 3 成功显示:
main.py整体代码
import uvicorn
from fastapi import FastAPI, applications
from fastapi.openapi.docs import get_swagger_ui_html
def 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', # 改用国内cdn
swagger_css_url='https://cdn.staticfile.org/swagger-ui/4.15.5/swagger-ui.min.css'
)
applications.get_swagger_ui_html = swagger_monkey_patch
app = 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