使用 FastAPI 创建 Python 项目并通过 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 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的编写与服务器环境配置),日后更分支,部署就方便多了。

    参考资料

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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用 FastAPI 创建 Python 项目并通过 Docker 进行部署

    发表回复