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

来自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 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嘛,经典!

启动项目
如下图所示,点击启动:
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 --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. 补充与总结

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_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的编写与服务器环境配置),日后更分支,部署就方便多了。

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值