跳至页脚内容
产品比较

FastAPI Python(开发者工作原理)

FastAPI 是一个现代的、高性能的Web框架,用于使用Python构建API。 它旨在易于使用和学习,同时提供强大的功能,如自动验证、序列化和自动交互式API文档。 此外,它可以与任何模板引擎一起使用,并允许您使用项目所需的任何默认模板配置。

让我们深入了解FastAPI的详细信息、其功能及如何有效地使用它。 Later in this article, we will also look into IronPDF, a PDF generation Python package from Iron Software.

FastAPI的关键特性

  1. 高性能:FastAPI是最快的Python框架之一,得益于其将Starlette用于Web部分和Pydantic用于数据部分,可与Node.js和Go相比。
  2. 易用性:它旨在直观,减少阅读文档所花的时间。 该框架利用标准的Python类型提示进行数据验证和序列化。
  3. 自动交互式文档:FastAPI使用OpenAPI和JSON Schema自动生成交互式API文档,可以通过/docs (Swagger UI) 和/redoc (ReDoc)访问。 API的任何更新都会自动反映在文档中。
  4. 编辑器支持:在VS Code等编辑器中提供优秀的代码补全和类型检查支持,使开发更快且减少错误。
  5. 基于标准:基于(并完全兼容)API的开放标准:OpenAPI和JSON Schema。

安装

您可以使用pip安装FastAPI和Uvicorn(ASGI服务器):

pip install fastapi
pip install "uvicorn[standard]"
pip install fastapi
pip install "uvicorn[standard]"
SHELL

创建您的第一个FastAPI应用

这是一个简单的示例,帮助您开始使用FastAPI并通过用户界面公开Python数据:

from fastapi import FastAPI

# Create a FastAPI 'app' instance
app = FastAPI()

# Root path operation
@app.get("/")
def read_root():
    return {"Hello": "World"}

# Path operation for items including query parameter 'q'
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}
from fastapi import FastAPI

# Create a FastAPI 'app' instance
app = FastAPI()

# Root path operation
@app.get("/")
def read_root():
    return {"Hello": "World"}

# Path operation for items including query parameter 'q'
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}
PYTHON

使用Uvicorn运行应用:

uvicorn main:app --reload
uvicorn main:app --reload
SHELL

此命令将启动一个开发服务器并在代码更改时自动重新加载。 您可以在http://127.0.0.1:8000/docs访问交互式API文档。

高级功能

FastAPI支持广泛的高级功能,使其适用于复杂应用:

  1. 依赖注入:FastAPI提供了一个强大的依赖注入系统,使您可以干净有效地管理依赖项。
  2. 后台任务:您可以定义后台任务,在返回响应后运行,适用于发送电子邮件或处理数据等任务。
  3. WebSockets:FastAPI支持WebSockets,实现客户端和服务器之间的实时通信。
  4. 安全性:FastAPI包含处理安全性的工具,包括OAuth2、JWT令牌等。
  5. 数据库集成:FastAPI可以使用像SQLAlchemy或Tortoise-ORM这样的库轻松集成到数据库中。

示例:构建CRUD API

让我们为管理项目构建一个简单的CRUD(创建、读取、更新、删除)API。

  1. 定义数据模型
from pydantic import BaseModel

# Define a Pydantic model for the item with default description and tax
class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
from pydantic import BaseModel

# Define a Pydantic model for the item with default description and tax
class Item(BaseModel):
    name: str
    description: str = None
    price: float
    tax: float = None
PYTHON
  1. 创建FastAPI应用
from fastapi import FastAPI, HTTPException

# Initialize 'app' instance and an empty 'items' dictionary
app = FastAPI()
items = {}

# Create operation: Add a new item
@app.post("/items/")
def create_item(item: Item):
    item_id = len(items) + 1
    items[item_id] = item
    return item

# Read operation: Retrieve an item by 'item_id'
@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    return items[item_id]

# Update operation: Replace an existing item
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    items[item_id] = item
    return item

# Delete operation: Remove an item by 'item_id'
@app.delete("/items/{item_id}")
def delete_item(item_id: int):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    del items[item_id]
    return {"message": "Item deleted"}
from fastapi import FastAPI, HTTPException

# Initialize 'app' instance and an empty 'items' dictionary
app = FastAPI()
items = {}

# Create operation: Add a new item
@app.post("/items/")
def create_item(item: Item):
    item_id = len(items) + 1
    items[item_id] = item
    return item

# Read operation: Retrieve an item by 'item_id'
@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    return items[item_id]

# Update operation: Replace an existing item
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    items[item_id] = item
    return item

# Delete operation: Remove an item by 'item_id'
@app.delete("/items/{item_id}")
def delete_item(item_id: int):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    del items[item_id]
    return {"message": "Item deleted"}
PYTHON

IronPDF 简介

FastAPI Python(开发人员如何运作):图1

IronPDF 是一个强大的Python库,旨在从HTML、CSS、图像和JavaScript创建、编辑和签署PDF。 它提供商业级性能,具有低内存占用。 关键特性包括:

HTML 至 PDF 转换

转换HTML文件、HTML字符串和URL为PDF。 例如,使用Chrome PDF渲染器将网页渲染为PDF。

跨平台支持

兼容包括.NET Core、.NET Standard和.NET Framework在内的各种.NET平台。 支持Windows、Linux和macOS。

编辑和签名

设置属性,使用密码和权限添加安全性,并为您的PDF应用数字签名。

页面模板和设置

自定义PDF的页眉、页脚、页码和可调节边距。 支持响应式布局和自定义纸张尺寸。

标准合规性

遵循PDF标准,如PDF/A和PDF/UA。 支持UTF-8字符编码,并处理图像、CSS和字体等资产。

使用IronPDF和FastAPI生成PDF文档

pip install fastapi
pip install ironPDF
pip install fastapi
pip install ironPDF
SHELL
from fastapi import FastAPI
from fastapi.responses import FileResponse
from ironpdf import *

# Apply your IronPDF license key
License.LicenseKey = "key"

# Initialize 'app' instance
app = FastAPI()

# Route for simple greeting
@app.get("/")
def read_root():
    return {"Hello": "IronPDF"}

# Route that reads items with path and query parameters
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

# Route for generating a PDF document
@app.get("/pdf")
async def get_pdf(greet1: str = None, greet2: str = None):
    # Use ChromePdfRenderer to create PDF from HTML
    renderer = ChromePdfRenderer()
    content = "<h1>Document Generated using IronPDF with FastAPI GET</h1>"
    content += "<p> Demonstrate PDF generation using User Inputs</p>"
    content += f"<p>Greetings from: {greet1}</p>"
    content += f"<p>And Greetings from: {greet2}</p>"
    pdf = renderer.RenderHtmlAsPdf(content)

    # Save the PDF to a file
    pdf.SaveAs("fastapi.pdf")

    # Create a response with the generated PDF
    headers = {
        "Content-Disposition": "inline; filename=sample.pdf"
    }
    return FileResponse("fastapi.pdf", media_type="application/pdf", headers=headers)
from fastapi import FastAPI
from fastapi.responses import FileResponse
from ironpdf import *

# Apply your IronPDF license key
License.LicenseKey = "key"

# Initialize 'app' instance
app = FastAPI()

# Route for simple greeting
@app.get("/")
def read_root():
    return {"Hello": "IronPDF"}

# Route that reads items with path and query parameters
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

# Route for generating a PDF document
@app.get("/pdf")
async def get_pdf(greet1: str = None, greet2: str = None):
    # Use ChromePdfRenderer to create PDF from HTML
    renderer = ChromePdfRenderer()
    content = "<h1>Document Generated using IronPDF with FastAPI GET</h1>"
    content += "<p> Demonstrate PDF generation using User Inputs</p>"
    content += f"<p>Greetings from: {greet1}</p>"
    content += f"<p>And Greetings from: {greet2}</p>"
    pdf = renderer.RenderHtmlAsPdf(content)

    # Save the PDF to a file
    pdf.SaveAs("fastapi.pdf")

    # Create a response with the generated PDF
    headers = {
        "Content-Disposition": "inline; filename=sample.pdf"
    }
    return FileResponse("fastapi.pdf", media_type="application/pdf", headers=headers)
PYTHON

代码解释

这个代码片段演示了IronPDF与FastAPI的集成,动态生成基于用户输入的PDF文档并将其作为可下载响应提供。

  1. 设置许可证密钥:应用IronPDF许可证密钥以启用其功能。

  2. FastAPI初始化:初始化一个FastAPI实例(app)以处理HTTP请求。

  3. 基本路由处理程序:    - read_root():当访问根URL(/)时,返回一个简单的JSON消息“Hello IronPDF”。    - read_item():接受一个item_id路径参数和一个可选的q查询参数。 返回带有这些参数的JSON响应。

  4. PDF生成路由(/pdf):    - get_pdf():此异步函数处理对/pdf端点的GET请求,带有名为greet1greet2的可选查询参数。    - 构造一个包含以下内容的HTML字符串(content):      - 指出文档来源和目的的标题。      - 展示使用用户输入(greet1greet2)进行PDF生成的段落。    - 使用来自IronPDF的ChromePdfRenderer()将HTML内容渲染为PDF(pdf = renderer.RenderHtmlAsPdf(content))。    - 将生成的PDF保存为“fastapi.pdf”(pdf.SaveAs("fastapi.pdf"))。

  5. 发送PDF:    - 配置响应头以指定PDF应在浏览器中内联查看("Content-Disposition": "inline; filename=sample.pdf")。    - 创建一个指向生成的PDF文件的FileResponse对象,具有适当的媒体类型("application/pdf")。    - 返回FileResponse对象,当访问/pdf端点时触发PDF文档的下载。

这个代码片段说明了IronPDF如何无缝集成到FastAPI中,以动态生成并基于用户输入提供PDF文档。 它展示了将HTML内容转换为PDF的能力,使其适用于需要即时生成和通过HTTP交付文档的应用程序。

输出

以下显示了API生成的Swagger输出。

FastAPI Python(开发人员如何运作):图2

PDF

FastAPI Python(开发人员如何运作):图3

IronPDF 许可证

IronPDF在Python中通过许可证密钥运行。 IronPDF for Python提供免费试用许可证密钥,允许用户在购买前查看功能。

在使用IronPDF包之前,将许可证密钥放在脚本的开头:

from ironpdf import *
# Apply your license key
License.LicenseKey = "key"
from ironpdf import *
# Apply your license key
License.LicenseKey = "key"
PYTHON

结论

FastAPI是一个为构建Python API而设计的强大且易于使用的框架。 FastAPI具有高性能、自动文档和高级功能,是初学者和有经验的开发人员的绝佳选择。 无论您是在构建简单的API还是复杂的Web应用,FastAPI都提供了成功所需的工具。

IronPDF是一个用于从HTML内容创建、操作和渲染PDF文档的强大Python库。 它提供HTML到PDF转换、交互表单创建、PDF操作(合并、拆分)和文本提取等功能。 非常适合轻松生成动态PDF并集成到各种Python应用中。

常见问题解答

如何在 Python 应用程序中将 HTML 内容转换为 PDF?

您可以使用 IronPDF 的 ChromePdfRenderer 将 HTML、CSS 和 JavaScript 内容转换为 PDF 文件。这允许无缝集成到 Python 应用程序中,以生成来自网络内容的 PDF 文档。

使用 FastAPI 构建 API 有什么好处?

FastAPI 提供高性能、自动验证、序列化和交互式 API 文档功能。它利用 Starlette 和 Pydantic 确保速度和效率,媲美 Node.js 和 Go,同时支持诸如 OpenAPI 这样的开放标准。

如何在 FastAPI 中提供 PDF 文档?

您可以通过使用 IronPDF 生成并利用 FastAPI 的 FileResponse 返回来在 FastAPI 中提供 PDF 文档。该方法允许您根据客户端请求动态创建和提供 PDF。

是什么使 FastAPI 适合实时应用程序?

FastAPI 支持 WebSockets,使客户端和服务器之间的实时通信成为可能,这使其成为需要即时数据更新或实时交互的应用程序的理想选择。

FastAPI 如何处理数据验证和序列化?

FastAPI 使用 Pydantic 模型和标准的 Python 类型提示来处理数据验证和序列化。这确保输入数据被正确验证并转换为所需格式,减少错误的可能性。

FastAPI 提供哪些安全功能?

FastAPI 提供强大的安全功能,包括 OAuth2、JWT 身份验证和依赖注入,让开发者可以轻松构建安全的应用程序。

IronPDF 可以用于跨平台应用程序吗?

是的,IronPDF 设计为跨平台,支持 Windows、Linux 和 macOS。对于希望在不同操作系统上运行应用程序中集成 PDF 生成的开发者来说,这是一个多功能的选择。

FastAPI 如何提高开发者的生产力?

FastAPI 通过提供自动 API 文档、代码完成功能和类型检查来提高开发者的生产力。这减少了详尽手动文档的需求,并有助于在开发过程中及早发现错误。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。