FastAPI 响应模型与自定义响应

FastAPI 响应模型与自定义响应

📚 目录

  1. 🎨 自定义响应类型概述
  2. 🗂️ 文件上传与下载详解
  3. 🍪 自定义响应头与 Cookie 配置

🎨 1. 自定义响应类型概述

在 FastAPI 中,自定义响应类型是开发者实现更丰富输出格式的重要方式。默认情况下,FastAPI 会根据返回的数据自动推断响应的类型,但在实际开发中,需求往往更加复杂,可能需要返回 HTML 页面、纯文本、XML 等不同格式的数据。

🔍 1.1 自定义 HTML 响应

在返回 HTML 页面时,可以直接使用 HTMLResponse。这是 FastAPI 提供的一个非常实用的响应类,能够简化 HTML 内容的返回过程。

🌟 代码示例
python 复制代码
from fastapi import FastAPI
from fastapi.responses import HTMLResponse

app = FastAPI()

@app.get("/", response_class=HTMLResponse)
def read_root():
    html_content = """
    <html>
        <head>
            <title>Welcome to FastAPI</title>
        </head>
        <body>
            <h1>Hello, FastAPI!</h1>
        </body>
    </html>
    """
    return html_content

🔧 代码解析

  • response_class=HTMLResponse 指定返回的内容为 HTML 格式。
  • HTML 内容直接以字符串的形式返回,这种方式在返回静态页面或小型动态页面时非常方便。

🛠️ 1.2 自定义纯文本响应

纯文本响应适用于接口需要返回简洁的字符串内容或错误信息时。

🌟 代码示例
python 复制代码
from fastapi.responses import PlainTextResponse

@app.get("/text", response_class=PlainTextResponse)
def get_text():
    return "This is a plain text response."

🔧 代码解析

  • 使用 PlainTextResponse 返回纯文本数据。
  • 适用于日志、调试信息等文本输出。

📄 1.3 返回 XML 数据

虽然 JSON 是主流的数据格式,但在某些场景下,XML 仍然是不可或缺的数据交换格式。

🌟 代码示例
python 复制代码
from fastapi.responses import Response
from fastapi.encoders import jsonable_encoder

@app.get("/xml", response_class=Response)
def get_xml():
    xml_content = """
    <note>
        <to>User</to>
        <from>FastAPI</from>
        <message>Hello, this is an XML response!</message>
    </note>
    """
    return Response(content=xml_content, media_type="application/xml")

🔧 代码解析

  • 通过 Response 类可以直接返回自定义格式的响应。
  • media_type 参数指定返回的 MIME 类型为 application/xml

🗂️ 2. 文件上传与下载详解

文件的上传与下载是 Web 开发中常见的功能。FastAPI 提供了一套便捷的接口用于处理这类需求,确保开发者能够快速实现文件操作。

📤 2.1 文件上传

文件上传的实现依赖于 UploadFileFile 类。

🌟 代码示例
python 复制代码
from fastapi import File, UploadFile

@app.post("/upload/")
def upload_file(file: UploadFile = File(...)):
    return {"filename": file.filename}

🔧 代码解析

  • UploadFile 提供了对上传文件的封装,包含文件名、文件类型和内容。
  • File(...) 表示该参数为必传项。
📂 多文件上传
python 复制代码
@app.post("/upload/multiple/")
def upload_multiple_files(files: list[UploadFile] = File(...)):
    return {"filenames": [file.filename for file in files]}

🔧 代码解析

  • 接收多个文件的方式是将 UploadFile 封装在列表中。

📥 2.2 文件下载

文件下载通常通过返回 FileResponse 实现。

🌟 代码示例
python 复制代码
from fastapi.responses import FileResponse
import os

@app.get("/download/{file_name}")
def download_file(file_name: str):
    file_path = f"./files/{file_name}"
    if os.path.exists(file_path):
        return FileResponse(path=file_path, filename=file_name)
    return {"error": "File not found"}

🔧 代码解析

  • FileResponse 提供了直接返回文件的能力。
  • 通过路径参数动态指定文件名称,实现文件的下载。

在 Web 开发中,设置自定义响应头与 Cookie 是提升用户体验和安全性的关键。FastAPI 提供了简单且强大的接口进行这些操作。

🎯 3.1 设置自定义响应头

🌟 代码示例
python 复制代码
from fastapi import Response

@app.get("/custom-header/")
def custom_header(response: Response):
    response.headers["X-Custom-Header"] = "CustomValue"
    return {"message": "Custom header set successfully"}

🔧 代码解析

  • response.headers 允许直接操作 HTTP 响应头。
  • 可用于添加跟踪标识或安全性相关的头部信息。
🌟 代码示例
python 复制代码
@app.get("/set-cookie/")
def set_cookie(response: Response):
    response.set_cookie(key="user_id", value="12345", httponly=True)
    return {"message": "Cookie set successfully"}

🔧 代码解析

  • set_cookie 方法允许设置 Cookie 参数。
  • httponly=True 确保 Cookie 只能通过 HTTP 请求访问,增强安全性。
相关推荐
William Dawson1 分钟前
Java 后端高频 20 题超详细解析 ①
java·开发语言
l1t2 分钟前
测试clickhouse 26.3的新功能
数据库·clickhouse
lly2024062 分钟前
PHP 魔术常量
开发语言
Evand J4 分钟前
【MATLAB例程分享】三维非线性目标跟踪,观测为:距离+方位角+俯仰角,使用无迹卡尔曼滤波(UKF)与RTS平滑,高精度定位
开发语言·matlab·目标跟踪
ZHENGZJM6 分钟前
前端基石:React + Vite + TypeScript 项目搭建
前端·react.js·typescript
SP八岐大兔7 分钟前
NPM管理OpenClaw安装、卸载及运维命令
运维·前端·npm·openclaw
编程之升级打怪8 分钟前
Java NIO的简单封装
java·开发语言·nio
在路上`9 分钟前
前端常见问题汇总(十一)_融合AI
前端
Mike117.10 分钟前
GBase 8a 批处理任务里的事务提交粒度和回滚边界
数据库
小江的记录本11 分钟前
【JEECG Boot】 《JEECG Boot 数据字典使用教程》(完整版)
java·前端·数据库·spring boot·后端·spring·mybatis