FAST API部署和使用

第一部分:FastAPI 的使用(开发环境)

1. 安装

首先,你需要安装 FastAPI 和一个 ASGI 服务器,最常用的是 Uvicorn。

pip install "fastapi[standard]"

这个命令会安装 FastAPI 以及所有推荐的依赖,包括 Uvicorn(用于服务器)、Pydantic(用于数据模型)等。

2. 创建一个简单的应用

创建一个名为 main.py 的文件:

# main.py
from fastapi import FastAPI# 创建 FastAPI 应用实例
app = FastAPI()# 定义根路径的 GET 请求处理程序
@app.get("/")
async def read_root():return {"message": "Hello, World!"}# 定义一个带路径参数的 GET 请求处理程序
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str = None):return {"item_id": item_id, "q": q}
3. 运行开发服务器

使用 Uvicorn 在本地运行你的应用:

uvicorn main:app --reload
  • main:app: main 是你的模块文件名(不含 .py),app 是你在代码中创建的 FastAPI() 实例的名称。
  • --reload: 让服务器在代码更改后自动重启。仅在开发时使用此选项

输出会显示服务器运行地址,通常是 http://127.0.0.1:8000

4. 交互式 API 文档

FastAPI 最强大的特性之一就是自动生成交互式 API 文档。启动服务器后,你可以访问:

  • Swagger UI 文档: http://127.0.0.1:8000/docs
    • 这是一个交互式界面,你可以直接看到所有端点,并尝试调用它们。
  • ReDoc 文档: http://127.0.0.1:8000/redoc
    • 这是一个更漂亮的、基于静态页面的文档。
5. 测试 API

你可以使用 curl、httpie 或任何 API 客户端(如 Postman, Insomnia)来测试你的 API。

# 测试根路径
curl http://localhost:8000# 测试带参数的路径
curl "http://localhost:8000/items/5?q=somequery"

第二部分:FastAPI 的部署(生产环境)

重要提示:千万不要在生产环境中使用 --reload 选项。

生产环境部署有多种方式,以下是几种最常见和推荐的方法。

方式 1: 使用 Uvicorn 直接运行(简单部署)

对于小型应用或初期部署,你可以直接运行 Uvicorn,但需要调整一些参数以获得更好的性能。

uvicorn main:app --host 0.0.0.0 --port 80 --workers 4
  • --host 0.0.0.0: 让服务器监听所有公共 IP,而不仅仅是本地回环地址 (127.0.0.1)。
  • --port 80: 使用标准的 HTTP 端口 80。
  • --workers 4: 启动多个工作进程(worker processes)。数量通常设置为 CPU 核心数 * 2 + 1。这利用了多进程模式,大大提高了并发能力。

优点:简单快捷。
缺点:缺乏高级功能,如 graceful shutdown、更复杂的负载均衡等。通常用于过渡或简单场景。

方式 2: 使用 Gunicorn 作为进程管理器(推荐)

Uvicorn 提供了一个 Worker 类,可以与 Gunicorn 这样的成熟进程管理器配合使用。Gunicorn 负责管理多个 Uvicorn 工作进程,提供了更强大的生产环境特性。

首先,安装 Gunicorn 和 Uvicorn:

pip install "uvicorn[standard]" gunicorn

然后使用 Gunicorn 来启动你的应用:

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000
  • main:app: 和之前一样。
  • -w 4, --workers 4: 设置工作进程的数量。
  • -k uvicorn.workers.UvicornWorker, --worker-class uvicorn.workers.UvicornWorker: 指定使用 Uvicorn 的工作器类。
  • -b 0.0.0.0:8000, --bind 0.0.0.0:8000: 绑定地址和端口。

这是部署 FastAPI/Starlette 应用的非常流行和稳健的方式。

方式 3: 使用 Docker 容器化部署(现代、标准的方式)

容器化部署提供了环境一致性、易于扩展和管理的巨大优势。

  1. 创建 Dockerfile

    在你的项目根目录下创建一个名为 Dockerfile 的文件(没有扩展名)。

    # 使用官方 Python 基础镜像
    FROM python:3.9-slim# 设置工作目录
    WORKDIR /app# 复制依赖文件并安装
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt# 复制应用代码
    COPY . .# 暴露端口
    EXPOSE 80# 运行应用
    # 方式 1: 直接使用 Uvicorn (适用于容器内部署)
    CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]# 方式 2: 使用 Gunicorn (更推荐用于生产)
    # CMD ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:80"]
    
  2. 创建 .dockerignore (可选但推荐)

    __pycache__
    *.pyc
    .env
    .git
    
  3. 构建和运行 Docker 镜像

    # 构建镜像
    docker build -t my-fastapi-app .# 运行容器
    docker run -d -p 80:80 --name my-app my-fastapi-app
    

    现在你的应用就在 Docker 容器中运行了,可以通过宿主机的 80 端口访问。

你可以轻松地将这个 Docker 镜像部署到任何支持容器的平台,如:

  • Kubernetes
  • Docker Compose (用于本地或单机部署)
  • Amazon ECS
  • Google Cloud Run
  • Azure Container Instances
方式 4: 使用其他 ASGI 服务器

除了 Uvicorn,你还可以选择其他 ASGI 服务器,例如:

  • Hypercorn: 一个灵感来源于 Gunicorn 的 ASGI 服务器,也支持 HTTP/2。
    pip install hypercorn
    hypercorn main:app --bind 0.0.0.0:8000
    

第三部分:生产环境额外考虑事项

  1. 环境变量配置:使用 pydantic.BaseSettings(例如 pydantic-settings 库)或 python-decouple 来管理敏感信息(如数据库密码、API 密钥),不要将它们硬编码在代码中。

  2. 反向代理:在生产环境中,通常会在 FastAPI 应用前面放置一个反向代理服务器,如 NginxTraefik。它们可以处理:

    • 静态文件:高效地提供图片、CSS、JS 等文件,减轻 FastAPI 的负担。
    • SSL 终止:处理 HTTPS 加密和解密。
    • 负载均衡:将流量分发到后端的多个应用实例。
    • GZip 压缩等。
  3. 监控和日志:确保正确配置日志记录。Uvicorn 和 Gunicorn 都有日志选项。考虑集成像 PrometheusGrafana 这样的监控工具,FastAPI 有很好的 Prometheus 集成库(如 fastapi-prometheus-grafana)。

总结

环境推荐方式命令示例
开发Uvicorn + --reloaduvicorn main:app --reload
生产(简单)Uvicorn 多 Workeruvicorn main:app --host 0.0.0.0 --port 80 --workers 4
生产(推荐)Gunicorn + Uvicorn Workergunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker ...
生产(现代)Docker + (Uvicorn/Gunicorn)docker build ...

对于新项目,强烈推荐从 Docker化 并结合 Gunicorn + Uvicorn Worker 的方式开始,这为未来的扩展和部署提供了最大的灵活性。

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

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

相关文章

【JavaWeb】之HTML(对HTML细节的一些总结)

大家天天开心! 文章目录 前言一、HTML的简介二、HTML运行方式三、html 的标签/元素-说明四、表单注意事项总结 前言 首先我们在把Java基础学习完之后,我们就要进行网站方面的开发了,我们要了解网页的组成,而网页的组成有HTML,CSS,…

互联网医院品牌IP的用户体验和生态构建

一、患者体验与信任构建互联网医院品牌IP的价值核心在于获得患者的深度信任,而卓越的用户体验是实现这一目标的关键路径。在医疗服务同质化严重的当下,患者体验已成为医疗机构差异化竞争的重要维度。研究表明,良好的用户体验能够提高用户满意…

【Node.js教程】Express框架入门:从搭建到动态渲染商品列表

前言 Visual Studio Code(简称VSCode)是微软开发的一款免费开源跨平台代码编辑器,凭借其免费、开源、跨平台的特性,以及丰富的插件生态和美观的界面,成为前端开发者的首选工具。 本文将带你从零开始学习Express框架,包括搭建项目、配置路由、使用中间件以及实现动态渲染…

众擎机器人开源代码解读

一,综述 EngineAI ROS 包: 高层开发模式:用户可通过发布身体速度指令,直接调用 EngineAI 机器人的行走控制器。底层开发模式:用户可通过发布关节指令,自主开发专属的控制器。 ROS2 package:全…

Windows系统安装Git详细教程

文章目录步骤 1:下载 Git 安装包步骤 2:运行安装程序步骤 3:选择安装路径步骤 4:选择组件步骤 5:选择默认编辑器步骤 6:选择路径环境变量步骤 7:选择 HTTPS 协议的传输方式步骤 8:配…

leetcode 3446. 按对角线进行矩阵排序 中等

给你一个大小为 n x n 的整数方阵 grid。返回一个经过如下调整的矩阵:左下角三角形(包括中间对角线)的对角线按 非递增顺序 排序。右上角三角形 的对角线按 非递减顺序 排序。示例 1:输入: grid [[1,7,3],[9,8,2],[4,…

携程旅行 web 验证码 分析

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 部分python代码 result cp…

JavaEE 进阶第一期:开启前端入门之旅(上)

专栏:JavaEE 进阶跃迁营 个人主页:手握风云 一、HTML基础 1.1. 什么是HTML HTML(Hyper Text Markup Language),超文本标记语言。 超文本:比文本要强大,通过链接和交互式方式来组织和呈现信息的文本形式。不仅仅有文本…

4.5 PBR

1.PBR简介 2.高光工作流 3.金属工作流1.PBR简介 PBR(Physically Based Rendering, 基于物理的渲染)的工作流分为金属工作流和高光工作流2.高光工作流 高光工作流是一种传统的工作流, 现在用的相对较少, 但是在某些特定情况下能提供更精细的控制a.核心思想它不区分金属和非金属,…

09.《路由基础知识解析和实践》

09.路由基础 文章目录09.路由基础核心概念路由关键组成部分三层转发原理介绍(通信流程)路由类型及配置直连路由(direct)实验示例**静态路由(Static)****实验示例****动态路由****RIP(routing information protocol---路…

websocket建立连接过程

1. 客户端发送一个GET的http请求,请求头要包含connection: upgradehost:localhost:8000。表明地址upgrade: websocket。指明升级的协议sec-websocket-key 。 安全验证密钥sec-websocket-version。 协议版本sec-websocket-accept 。对传过来的key进行加密…

Simulink库文件-一种低通滤波模块搭建方法

在汽车电控系统应用层开发中,经常会用到低通滤波模块,其主要作用是去除输入信号中的高频干扰,防止由于输入信号的干扰引起后续执行系统的非预期频繁波动。本文介绍简要介绍低通滤波的定义及作用,并介绍一种低通滤波模块simulink搭…

【C++游记】AVL树

枫の个人主页 你不能改变过去,但你可以改变未来 算法/C/数据结构/C Hello,这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕,我们继续来学习C的内容呀。C是接近底层有比较经典的语言,因此学习起来注定枯燥无味&#xf…

音视频学习(六十二):H264中的SEI

什么是SEI? 在 H.264 视频编码标准中,补充增强信息(Supplemental Enhancement Information,SEI) 是一种特殊的 NAL(网络抽象层)单元。它不像序列参数集(SPS)或图像参数集&#xff0…

docker run 后报错/bin/bash: /bin/bash: cannot execute binary file总结

以下方法来源于AI&#xff0c;个人仅验证了第三条便成功执行 1. 镜像与宿主机架构不匹配 比如&#xff1a; 你是 x86_64 的机器&#xff0c;但镜像是 ARM64 的&#xff08;或反之&#xff09;。在 PC 上拉了树莓派用的镜像。查看镜像架构 docker inspect <image_name> | …

【Redisson 加锁源码解析】

Redisson 源码解析 —— 分布式锁实现过程 在分布式系统中&#xff0c;分布式锁 是非常常见的需求&#xff0c;用来保证多个节点之间的互斥操作。Redisson 是 Redis 的一个 Java 客户端&#xff0c;它提供了对分布式锁的良好封装。本文将从源码角度剖析 Redisson 的分布式锁实现…

uni-app支持单多选、搜索、查询、限制能否点击组件

<template><view class="multi-select-container" :class="{ single-select: !multiple, no-search: !searchable }"><!-- 当组件被禁用时,直接显示选中的内容 --><view class="disabled-display" v-if="disabled &a…

TFT屏幕:STM32硬件SPI+DMA+队列自动传输

看了网上的很多的SPIDMA的代码&#xff0c;感觉都有一些缺陷&#xff0c;就是基本都是需要有手动等待DMA完成的这个操作&#xff0c;我感觉这种等待操作在很大程度上浪费了时间&#xff0c;那么我加入的“队列”就是一种将等待时间利用起来的方法。原本的SPIDMA的操作逻辑如下图…

AI操作系统语言模型设计 之1 基于意识的Face-Gate-Window的共轭路径的思维-认知-情感嵌套模型

摘要&#xff08;AI生成&#xff09;本文提出了一种创新的AI操作系统语言模型设计框架&#xff0c;将人类意识活动的分层结构映射到人工智能系统中。该模型包含三个嵌套层次&#xff1a;理性思维层&#xff08;Face层&#xff09;&#xff1a;采用双面胶隐喻&#xff08;A/B面&…

疯狂星期四文案网第57天运营日记

网站运营第57天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今日搜索引擎收录情况