【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 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基于SpringBoot的在线文档管理系统的设计与实现论文

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;在线文档管理当然也不能排除在外。在线文档管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&am…

合并两个有序链表

题目 题目链接 合并两个排序的链表_牛客题霸_牛客网 题目描述 代码实现 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param pHead1 ListNode类 * param pHead2 ListNode类 * return …

1分钟学会Python字符串前后缀与编解码

1.前缀和后缀 前缀和后缀指的是&#xff1a;字符串是否以指定字符开头和结尾 2.startswith() 判断字符串是否以指定字符开头&#xff0c;若是返回True&#xff0c;若不是返回False str1 "HelloPython"print(str1.startswith("Hello")) # Trueprint…

Python 微信自动化工具wxauto开发系列01(2024年3月可用 支持3.9最新微信)

下载链接&#xff1a;GitHub - cluic/wxauto: Windows版本微信客户端&#xff08;非网页版&#xff09;自动化&#xff0c;可实现简单的发送、接收微信消息&#xff0c;简单微信机器人d 推荐大家在github下载&#xff1a; git clone https://github.com/cluic/wxauto.git cd w…

数据结构——基本术语和概念

目录 1.数据 2.数据元素 3.数据项 4.数据对象 数据元素与数据对象 5.数据结构 1.逻辑结构 逻辑结构的种类 划分方式1 1.线性结构 2.非线性结构 ​ 划分方式2——四类基本逻辑结构 2.物理结构&#xff08;存储结构&#xff09; 1.顺序存储结构 2.链接存储结构 3…

【贪心算法】Leetcode 455.分发饼干 376. 摆动序列 53. 最大子数组和

【贪心算法】Leetcode 455 分发饼干 376. 摆动序列【规律很多】53. 最大子数组和 455 分发饼干局部最优推全局最优&#xff1a;尽量用大饼干去满足大胃口的小朋友 376. 摆动序列【规律很多】思想&#xff1a;注意考虑一个坡度留首尾两个点、平坡、首尾 53. 最大子数组和【好思想…

SD-WAN助力企业数据传输安全

随着企业网络需求的不断增长&#xff0c;SD-WAN成为企业网络组网的首选方案&#xff0c;能够实现多种网络拓扑结构的无缝连接&#xff0c;其中包括总部-分支、总部-分支-数据中心、总部-数据中心、总部-分支-云服务等。如何确保企业数据在传输过程中的安全性成为企业关注的重要…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的植物病害检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发高效的植物病害检测系统对于提升农业生产效率和作物健康管理意义重大。本篇博客详细阐述了如何运用深度学习技术构建一个植物病害检测系统&#xff0c;并提供了完整的实现代码。该系统基于先进的YOLOv8算法&#xff0c;对YOLOv7、YOLOv6、YOLOv5进行了性能…

用指针数组完成单词倒排

描述 对字符串中的所有单词进行倒排。 说明&#xff1a; 1、构成单词的字符只有26个大写或小写英文字母&#xff1b; 2、非构成单词的字符均视为单词间隔符&#xff1b; 3、要求倒排后的单词间隔符以一个空格表示&#xff1b;如果原字符串中相邻单词间有多个间隔符时&…

更换个人开发环境后,pycharm连接服务器报错Authentication failed

原因&#xff1a;服务器中更换个人开发环境后&#xff0c;密码变了。 解决&#xff1a;在pycharm中修改服务器开发环境密码即可。 1 找到Tools-Depolyment-Configuration 2 点击SSH Configuration后的省略号 3 修改这里面的Password即可

SVN教程-SVN的基本使用

SVN&#xff08;Apache Subversion&#xff09;是一款强大的集中式版本控制系统&#xff0c;它在软件开发项目中扮演着至关重要的角色&#xff0c;用于有效地跟踪、记录和管理代码的演变过程。与分布式系统相比&#xff0c;SVN 的集中式架构使得团队能够更加协同地进行开发&…

Docker将本地的镜像上传到私有仓库

使用register镜像创建私有仓库 [rootopenEuler-node1 ~]# docker run --restartalways -d -p 5000:5000 -v /opt/data/regostry:/var/lib/registry registry:2[rootopenEuler-node1 ~]# docker images REPOSITORY TAG IMAGE…

DataIntegrityViolationException异常产生原因及解决方案

DataIntegrityViolationException异常产生原因及解决方案 01 异常的发生场景 在我新写了一个接口之后出现的 //org.springframework.dao.DataIntegrityViolationException日志报错的意思是参数设置了一个错误的值 02 异常的产生及其原因 我最开始认为是MySQL数据库表设计…

【学习总结】什么是DoS和DDoS

[Q&A] 什么是DoS DoS 是 “Denial of Service”&#xff08;拒绝服务&#xff09;的缩写&#xff0c;它是一种网络攻击方式&#xff0c;其目的是使目标计算机或网络资源无法为合法用户提供正常的服务。通过向目标系统发送大量请求、消耗其带宽、处理器或内存等资源&#…

网络安全: Kali Linux 使用 nmap 扫描目标主机

目录 一、实验 1.环境 2. Kali Linux (2024.1) 使用 namp 扫描目标主机 3.Kali Linux (2024.1)远程登录 Windows Server 4.Kali Linux (2024.1) 使用crunch字典工具 5.Kali Linux (2024.1)使用hydra密码工具 6.Kali Linux (2022.3) 通过SSH端口获取 Ubuntu 密码 二、问题…

备考2024年北京高考数学:20114~2023十年选择题练习和解析

距离2024年高考还有三个月的时间&#xff0c;如何用三个月的时间再提高北京数学高考的成绩&#xff1f;吃透历年真题以及背后的知识点是行之有效的方法 之一。 今天我们来看一下2014-2023年的北京市高考数学的选择题&#xff0c;从过去十年&#xff08;2014-2023&#xff09;的…

SandBox中的JavaAgent技术

8.1 JavaAgent Java Agent 是一种强大的技术&#xff0c;在运行时动态修改已加载类的字节码&#xff0c;为应用程序注入额外的功能和行为。 JDK 1.5 支持静态 Instrumentation&#xff0c;基本的思路是在 JVM 启动的时候添加一个代理&#xff08;javaagent&#xff09;&#…

【python debug】python常见编译问题解决方法_2

序言 记录python使用过程中碰到的一些问题及其解决方法上一篇&#xff1a;python常见编译问题解决方法_1 1. PermissionError: [Errno 13] Permission denied: ‘/lostfound’ 修改前&#xff1a; 修改后&#xff08;解决&#xff09;&#xff1a; 此外&#xff0c;可能文件夹…

048 异常

什么是异常 异常体系结构 异常的继承关系 Error Exception 异常处理机制 try&#xff1a;用{}将可能产生异常的代码包裹catch&#xff1a;与try搭配使用&#xff0c;捕获try包裹代码中抛出的异常并进行后续动作finally&#xff1a;跟在try后&#xff0c;在try和catch之后执行…

【HTML】HTML基础6.1(表格以及常见属性)

目录 表格介绍 表格标签 表格标签的常见属性 案例 知识点总结 表格介绍 在浏览器中&#xff0c;我们经常见到形如 这样的表格形式&#xff0c;一般来说&#xff0c;表格是为了让数据看起来更加清晰&#xff0c;增强数据的可读性 有的程序员也会用表格进行排版 表格标签 &…