FastAPI 訪問不了API文檔或配置不生效的解決方法

FastAPI中文教程

本文背景

FastAPI框架自帶交互式api文檔,通過路由/docs或者/redoc 訪問,但是FastAPI 的文檔界面(如 /docs 和 /redoc)依賴于外部的 JavaScript 和 CSS 庫,如果項目部署環境網絡不佳或者無法訪問外網的時候,會因為無法獲取外部庫而無法正確訪問交互式api文檔界面,所以在實際項目中更推薦將外部文件下載到本地,然后修改文檔引用的資源地址, 使用本地靜態文件一方面能夠提高請求性能(,因為它們在處理靜態內容時通常效率更高),另一方面更加也安全。
在這里插入圖片描述

下載必要的靜態文件

Swagger UIReDoc 都有其前端靜態資源,可以從它們的 GitHub repositories 中下載。

Swagger UI
  1. 訪問 Swagger UI GitHub Releases頁面。
  2. 下載 ZIP 文件(通常是最新的 release)并解壓縮。
  3. 從解壓后的文件中找到 dist 文件夾復制到 FastAPI 項目的某個目錄下,例如 static/swagger-ui
ReDoc
  1. 訪問 redoc.standalone.js 頁面,將其另存為redoc.standalone.js并保存到FastAPI 項目的某個目錄下,例如static/redoc
    在這里插入圖片描述

項目代碼改造

1. 禁用 Swagger UI 和 ReDoc 文檔

初始化FastAPI app時,禁用默認的api文檔,app = FastAPI(docs_url=None, redoc_url=None) 注意,這里必須要禁用,否則訪問/docs或者/redoc 查看api文檔時還是訪問的外網獲取依賴文件,并沒有使用項目中的靜態文件

2. 掛載靜態文件路徑

app.mount("/static", StaticFiles(directory='static'), name="static")

3. 重寫 /docs與/redoc路由

在上文中,在初始化應用時已經禁用了默認的接口文檔路由,為了項目能夠訪問接口文檔地址,我們需要重寫接口路由,并且指定配置為本地的靜態文件而不是在線的UI資源

@app.get("/docs", include_in_schema=False)
async def custom_swagger_ui_html():return get_swagger_ui_html(openapi_url=app.openapi_url,title=app.title + " - Swagger UI",oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url,swagger_js_url="/static/swagger-ui/swagger-ui-bundle.js",swagger_css_url="/static/swagger-ui/swagger-ui.css",swagger_favicon_url="/static/swagger-ui/favicon-32x32.png",)@app.get("/redoc", include_in_schema=False)
async def redoc_html():return get_redoc_html(openapi_url=app.openapi_url,title=app.title + " - ReDoc",redoc_js_url="/static/redoc/redoc.standalone.js",# redoc_favicon_url="/static/redoc/favicon.png" # 影響不大)

經過上述改造后,重啟服務訪問接口文檔地址就可以發現,UI依賴文件已經不在訪問外網獲取而是使用項目的靜態文件,完整代碼查看后文
在這里插入圖片描述

完整代碼

# -*- coding: utf-8 -*-
import uvicorn
from typing import Union
from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_htmlfrom pydantic import BaseModelapp = FastAPI(docs_url=None, redoc_url=None)app.mount("/static", StaticFiles(directory='static'), name="static")class Item(BaseModel):name: strprice: floatis_offer: Union[bool, None] = None@app.get("/")
async def read_root():return {"Hello": "World"}@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Union[str, None] = None):return {"item_id": item_id, "q": q}@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):return {"item_name": item.name, "item_id": item_id}@app.get("/docs", include_in_schema=False)
async def custom_swagger_ui_html():return get_swagger_ui_html(openapi_url=app.openapi_url,title=app.title + " - Swagger UI",oauth2_redirect_url=app.swagger_ui_oauth2_redirect_url,swagger_js_url="/static/swagger-ui/swagger-ui-bundle.js",swagger_css_url="/static/swagger-ui/swagger-ui.css",swagger_favicon_url="/static/swagger-ui/favicon-32x32.png",)@app.get("/redoc", include_in_schema=False)
async def redoc_html():return get_redoc_html(openapi_url=app.openapi_url,title=app.title + " - ReDoc",redoc_js_url="/static/redoc/redoc.standalone.js",# redoc_favicon_url="/static/redoc/favicon.png" # 可以不設置)if __name__ == "__main__":uvicorn.run('main:app', host="127.0.0.1", port=8000, reload=True, workers=1)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96174.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96174.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96174.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IAR 集成開發環境入門指南:字體設置與調試實戰

一、IAR 的基本使用教程1. IAR 顏色字體大小設置打開設置路徑:點擊頂部菜單欄 Tools → 選擇 Options,打開 IDE 配置窗口。進入字體顏色設置界面:在彈出的 “IDE Options” 窗口中,雙擊展開 Editor 選項,然后點擊 Colo…

10:00開始面試,10:06就出來了,問的問題有點變態。。。

從小廠出來,沒想到在另一家公司又寄了。到這家公司開始上班,加班是每天必不可少的,看在錢給的比較多的份上,就不太計較了。沒想到8月一紙通知,所有人不準加班,加班費不僅沒有了,薪資還要降40%,這…

Flink 狀態管理的核心能力

我們來看一個復雜的實際案例:阿里巴巴菜鳥的實時物流追蹤系統。 該系統處理來自多個電商平臺(天貓、淘寶、速賣通)的訂單包裹,通過一個復雜的處理流程: 合并與去重:通過聚合操作將不同來源的訂單合并并去重…

基于go語言的云原生TodoList Demo 項目,驗證云原生核心特性

以下是一個基于 Go 語言 的云原生 TodoList Demo 項目,涵蓋 容器化、Kubernetes 編排、CI/CD、可觀測性、彈性擴縮容 等核心云原生特性,代碼簡潔且附詳細操作指南,適合入門學習。項目概覽 目標:實現一個支持增刪改查(C…

手機能看、投屏 / 車機不能看與反向鏈接驗證類似嗎?

有一定關聯,但兩者的技術邏輯并非完全等同 ——“手機能看、投屏 / 車機不能看” 的核心原因更復雜,反向鏈接驗證是其中一種可能的限制手段,但不是唯一甚至不是最主要的手段。要理清這個問題,需要先拆解 “投屏 / 車機播放受限” …

25年9月通信基礎知識補充1:NTN-TDL信道建模matlab代碼(satellite-communications toolbox學習)

看文獻過程中不斷發現有太多不懂的基礎知識,故長期更新這類blog不斷補充在這過程中學到的知識。由于這些內容與我的研究方向并不一定強相關,故記錄不會很深入請見諒。 【通信基礎知識補充10】25年9月通信基礎知識補充1:NTN-TDL信道建模matlab…

洛谷P3370 【模板】字符串哈希 (哈希表)詳解

題目如下:(注:解此題我只需左手一根指頭,哈哈哈哈哈哈哈)注意,哈希表的好處是能大幅度減少尋找遍歷的時間可能有人不理解哈希值, 這里哈希的模的值一般得是比較大的質數,如標準的100…

光子芯片驅動的胰腺癌早期檢測:基于光學子空間神經網絡的高效分割方法(未做完)

光子芯片驅動的胰腺癌早期檢測:基于光學子空間神經網絡的高效分割方法 1 論文核心概念 本文提出了一種基于集成光子芯片的光學子空間神經網絡(Optical Subspace Neural Network, OSNN),用于胰腺癌的早期檢測與圖像分割。其核心思想是利用光子芯片的高并行性、低延遲和低能…

GraphRAG 工作原理逐步解析:從圖創建到搜索的實戰示例

本篇文章How GraphRAG Works Step-By-Step: From Graph Creation to Search with Real Examples | Towards AI詳細介紹了GraphRAG的工作原理,適合對檢索增強生成(RAG)和知識圖譜感興趣的讀者。文章的技術亮點在于通過圖結構提升信息檢索效率&…

LAMPSecurity: CTF8靶場滲透

LAMPSecurity: CTF8 來自 <https://www.vulnhub.com/entry/lampsecurity-ctf8,87/> 1&#xff0c;將兩臺虛擬機網絡連接都改為NAT模式 2&#xff0c;攻擊機上做namp局域網掃描發現靶機 nmap -sn 192.168.23.0/24 那么攻擊機IP為192.168.23.128&#xff0c;靶場IP192.168…

綠算技術閃耀智博會 賦能鄉村振興與產業升級

9月5日至7日&#xff0c;由寧波市人民政府、浙江省經濟和信息化廳、中國信息通信研究院聯合主辦的第十五屆智慧城市與智能經濟博覽會在寧波國際會展中心圓滿落幕。綠算技術受邀參展&#xff0c;并發布與北京東方聯鳴科技發展有限公司聯合打造的《360數智牧業AI模型支撐底座》&a…

淺談“SVMSPro視頻切片”技術應用場景

技術定義視頻切片是一項將連續不斷的視頻流&#xff0c;按特定規則&#xff08;如時間點、事件觸發&#xff09;切割成一個個獨立、完整的MP4等標準視頻文件的技術。這些切片文件體積小、格式通用&#xff0c;易于管理、傳輸和播放。核心價值精準存檔&#xff1a;從海量錄像中精…

php 使用html 生成pdf word wkhtmltopdf 系列1

php 使用html 生成pdf word wkhtmltopdf 系列2 php 使用html 生成 pdf word 項目有個需求 想同時生成word 和pdf 并且對pdf要求比較高 為了一勞永逸 決定寫成html 分別轉成word 和pdf 系統環境 windows10 小皮面板&#xff08;php8&#xff09; linux centos 7.9 寶塔&…

Git常用命令大全:高效開發必備

目錄 常用Git命令清單 1. 新建代碼庫 2. 配置 3. 增加/刪除文件 4. 代碼提交 5. 分支 6. 標簽 7. 查看信息 8. 遠程同步 9. 撤銷 10. 常用操作組合 修改本地分支名和遠程分支名 附錄&#xff1a;Git命令思維導圖 安裝gitlab 常用Git命令清單 一般來說&#xff0…

AJAX入門-URL

本系列可作為前端學習系列的筆記&#xff0c;代碼的運行環境是在VS code中&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 HTML、CSS、JavaScript系列文章 已經收錄在前端專欄&#xff0c;有需要的寶寶們可以點擊前端專欄查…

【深度學習新浪潮】什么是具身智能?

具身智能(Embodied AI)是人工智能與機器人技術深度融合的前沿領域,其核心是通過物理實體與環境的實時交互閉環,實現感知-認知-決策-行動的一體化自主進化。這類系統不僅能理解語言指令,更能通過高精度傳感器(如觸覺、視覺、力覺融合)感知物理世界,依托多模態大模型完成…

動畫藍圖與動畫狀態機:從 Unity Mecanim 到 Unreal Animation Blueprint 的一把梭

動畫藍圖與動畫狀態機&#xff1a;從 Unity Mecanim 到 Unreal Animation Blueprint 的一把梭這篇是系列的第一篇。目標很簡單&#xff1a;把 Unreal 的 Animation Blueprint 和 Unity 的 Animator Controller&#xff08;Mecanim&#xff09; 放在同一張桌子上&#xff0c;系統…

實戰案例:數字孿生+可視化大屏,如何高效管理智慧能源園區?

摘要&#xff1a; 當智慧遇上能源&#xff0c;一場管理革命正在悄然發生。想象一下&#xff1a;一個占地千畝的能源園區&#xff0c;光伏板、儲能站、風力機組星羅棋布&#xff0c;傳統管理模式下&#xff0c;數據分散、響應滯后、故障頻發... 但某園區引入“數字孿生可視化大屏…

Django 從環境搭建到第一個項目

作為一名剛接觸 Django 的開發者&#xff0c;我在學習過程中整理了這份入門筆記&#xff0c;涵蓋 Django 框架基礎、環境搭建、第一個項目創建以及核心配置&#xff0c;希望能為同樣剛入門的小伙伴提供清晰的學習思路。 一、Django 框架基礎認知 在開始實際操作前&#xff0c…

機器學習實操項目02——Pandas入門(基本操作、創建對象、查看數據、數據選擇、處理缺失數據、數據合并、數據分組、時間序列、繪圖、文件導出)

上一章&#xff1a;機器學習實操項目01——Numpy入門&#xff08;基本操作、數組形狀操作、復制與試圖、多種索引技巧、線性代數&#xff09; 下一章&#xff1a; 機器學習核心知識點目錄&#xff1a;機器學習核心知識點目錄 機器學習實戰項目目錄&#xff1a;【從 0 到 1 落地…