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

news2025/2/24 2:50:29

文章目录

  • 前言&需求描述
  • 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

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

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

相关文章

python matplotlib 三维实体圆柱图

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 import matplotlib.pyplot as plt import matplotlib as mpl import numpy as np from mpl_toolkits.mplot3d import Axes3D import matplotlib.ticker as tickerdef map_rate(X: list, to_min: float, to_max: float)…

Restful风格解释

示例对比 传统风格开发 Restful风格开发 结论&#xff1a; 传统风格开发中&#xff0c;前端不同操作使用不同的url来访问后端&#xff0c;使得访问变得麻烦restful风格中&#xff0c;前端使用相同的url来访问后端&#xff0c;但是用数据传送方式进行区分&#xff08;get为请求…

DataGrip2023配置连接Mssqlserver、Mysql、Oracle若干问题解决方案

1、Mssqlserver连接 本人连的是Sql2008&#xff0c;默认添加时&#xff0c;地址、端口、实例、账号、密码后&#xff0c;测试连接出现错误。 Use SSL&#xff1a;不要勾选 VM option&#xff1a;填写&#xff0c;"-Djdk.tls.disabledAlgorithmsSSLv3, RC4, DES, MD5withR…

c#使用log4net的3种调用方法

https://blog.csdn.net/summer_top/article/details/107961245 第一步&#xff1a;下载log4net。 右键项目引用&#xff0c;进入管理NuGet包。 搜索log4net&#xff0c;下载安装。 第二步&#xff1a;创建LogHelper类。 public class LogHelper { private LogHelp…

说一说kong日志级别

Kong官网&#xff1a;The Platform Powering the API World | Kong Inc. Kong Gateway&#xff1a;Kong Gateway | Kong Docs Kong Admin API&#xff1a;Admin API - Kong Gateway - v3.4.x | Kong Docs Kong 企业版社区&#xff1a;API Community for Developers and Industr…

ad18学习笔记十六:如何放置精准焊盘到特定位置,捕抓功能的讲解

网上倒是一堆相关的指导 AD软件熟练度提升&#xff0c;如何设置板框捕捉&#xff1f;_哔哩哔哩_bilibili 关于Altium Designer 20 的捕抓功能的讲解_ad捕捉设置-CSDN博客 AD软件捕捉进阶实例&#xff0c;如何精确的放置布局元器件&#xff1f;_哔哩哔哩_bilibili AD绘制PCB…

android游戏开发大全pdf,赶紧学起来

面经分享 第一部分是我前端面试的经验总结&#xff0c;第二部分是我认为比较有思考空间的题目 经验总结 一份漂亮的简历&#xff0c;需要包括以下部分&#xff08;排版由上而下&#xff09; 个人亮点&#xff08;专精领域&#xff0c;个人博客&#xff0c;开源项目&#xff09…

jmeter 压测数据库

当前版本&#xff1a; jmeter 5.6.3mysql 5.7.39 简介 JMeter 是一个开源的 Java 应用程序&#xff0c;主要用于进行性能测试和负载测试。它支持多种协议&#xff0c;包括但不限于 HTTP、HTTPS、FTP、JDBC 以及各种 Web Services。对于数据库的压力测试可以使用 JDBC 协议与数…

Python算法题集_组合总和

Python算法题集_组合总和 题39&#xff1a;组合总和1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【值传递回溯】2) 改进版一【引用传递堆栈回溯】3) 改进版二【过程值列表缓存遍历后检索】 4. 最优算法5. 相关资源 本文为Python算法题集之一的…

【办公类-22-07】周计划系列(3-2)“信息窗+主题知识(优化)” (2024年调整版本)

作品展示&#xff1a; 背景需求 前文对“2023年2月”的一套信息窗主题知识的文件系列&#xff0c;进行第一次的提取。获得基础模板。 【办公类-22-07】周计划系列&#xff08;3-1&#xff09;“信息窗主题知识&#xff08;提取&#xff09;” &#xff08;2024年调整版本&…

面试官问我Redis怎么测,我哪知道!

有些测试朋友来问我&#xff0c;redis要怎么测试&#xff1f;首先我们需要知道&#xff0c;redis是什么&#xff1f;它能做什么&#xff1f; redis是一个key-value类型的高速存储数据库。 redis常被用做&#xff1a;缓存、队列、发布订阅等。 所以&#xff0c;“redis要怎么测试…

理解计算着色器中glsl语言的内置变量

概要 本文通过示例的方式&#xff0c;着重解释以下几个内置变量&#xff1a; gl_WorkGroupSizegl_NumWorkGroupsgl_LocalInvocationIDgl_WorkGroupIDgl_GlobalInvocationID 基本概念 局部工作组与工作项 一个3x2x1的局部工作组示例如下&#xff0c;每个小篮格子表示一个工作项…

简单了解B树和B+树

目录 B树 B树 B树和B树的结构示意图 总结 B树和B树是两种非常重要的树状数据结构&#xff0c;它们广泛应用于数据库和文件系统的索引结构中。这两种数据结构能够帮助我们高效地管理、查询以及更新大量的数据。下面&#xff0c;我将简单介绍它们,以及他们之间的区别。 B树 B…

【leetcode】链表的中间节点

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 点击查看题目 思路: slow和fast都初始化为head&#xff0c;之后slow每走1步&#xff0c;fast走2步…

枚举(蓝桥练习)(反倍数、特别数的和、找到最多的数、小蓝的漆房、小蓝和小桥的挑战)

目录 一、枚举算法介绍 二、解空间的类型 三、循环枚举解空间 四、例题 &#xff08;一、反倍数&#xff09; &#xff08;二、特别数的和&#xff09; &#xff08;三、找到最多的数&#xff09; &#xff08;四、小蓝的漆房&#xff09; &#xff08;五、小蓝和小桥的…

【力扣hot100】刷题笔记Day17

前言 今天竟然不用开组会&#xff01;天大的好消息&#xff0c;安心刷题了 46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 回溯&#xff08;排列&#xff09; class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 回溯def backtrack():if len(…

一、前端开发

#视频链接&#xff1a;https://www.bilibili.com/video/BV1rT4y1v7uQ?p1&vd_source1717654b9cbbc6a773c2092070686a95 前端开发 前端开发1、快速开发网站2、浏览器能识别的标签2.1 编码&#xff08;head&#xff09;2.2 title(head)2.3 标题2.4 div和span练习题2.5 超链接…

如何做代币分析:以 USDT 币为例

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;USDT Token Dashboard &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关…

prometheus监控带安全认证的elasticsearch

1.下载elasticsearch_exporter wget 下载二进制包并解压、运行&#xff1a; wget https://github.com/prometheus-community/elasticsearch_exporter/releases/download/v1.3.0/elasticsearch_exporter-1.3.0.linux-amd64.tar.gz tar -xvf elasticsearch_exporter-1.3.0.lin…

imazing是啥 ?iMazing 3.0.0.3中文版会有哪些新功能?

imazing是啥 imazing是管理iOS设备的软件 iMazing 是一款用于管理iOS设备的软件。它支持在Windows和Mac电脑上对基于iOS系统的设备进行数据传输、备份和管理。用户可以通过这款软件传输和备份包括照片、音乐、铃声、视频、电子书及通讯录等多种信息。不仅限于iPhone、iPad或iP…