当前位置: 首页 > article >正文

FastAPI 静态文件

FastAPI 静态文件学习笔记一、基本用法 —StaticFiles1. 挂载静态文件目录fromfastapiimportFastAPIfromfastapi.staticfilesimportStaticFiles appFastAPI()# 将 ./static 目录挂载到 /static 路径app.mount(/static,StaticFiles(directorystatic),namestatic)目录结构project/ ├── main.py └── static/ ├── css/ │ └── style.css ├── js/ │ └── app.js └── images/ └── logo.png访问方式http://localhost:8000/static/css/style.css http://localhost:8000/static/js/app.js http://localhost:8000/static/images/logo.png2. 参数说明参数类型默认值说明directorystr/Path必填静态文件目录路径htmlboolFalse是否启用 HTML 模式check_dirboolTrue启动时检查目录是否存在二、HTML 模式1. 启用 HTML 模式app.mount(/,StaticFiles(directorystatic,htmlTrue),namestatic)HTML 模式行为请求路径文件存在情况响应/index.html存在返回index.html/aboutabout.html存在返回about.html/about/about/index.html存在返回about/index.html/style.cssstyle.css存在返回style.css/missing无匹配文件4042. 典型用途 — 托管 SPA 前端# Vue / React 构建产物app.mount(/,StaticFiles(directorydist,htmlTrue),namespa)dist/ ├── index.html ├── assets/ │ ├── index.abc123.js │ └── index.def456.css └── favicon.ico注意SPA 的前端路由如/about、/user/1需要服务端统一返回index.htmlhtmlTrue只处理.html文件匹配不支持 SPA fallback。完整 SPA 托管方案见第五节。三、挂载位置与路由优先级1.app.mount的特性mount创建的是一个子应用会匹配该路径下的所有请求不再经过主应用的路由匹配appFastAPI()app.get(/static/data)# ← 永远不会被访问到asyncdefget_data():return{data:hello}app.mount(/static,StaticFiles(directorystatic),namestatic)# /static/* 的所有请求都被 StaticFiles 拦截2. 正确的挂载顺序appFastAPI()# ① 先注册 API 路由app.get(/api/data)asyncdefget_data():return{data:hello}# ② 最后挂载静态文件避免覆盖 API 路由app.mount(/static,StaticFiles(directorystatic),namestatic)3. 挂载多个静态目录app.mount(/static,StaticFiles(directorystatic),namestatic)app.mount(/uploads,StaticFiles(directoryuploads),nameuploads)app.mount(/assets,StaticFiles(directoryassets),nameassets)四、在 Jinja2 模板中引用静态文件fromfastapiimportFastAPI,Requestfromfastapi.staticfilesimportStaticFilesfromfastapi.templatingimportJinja2Templates appFastAPI()app.mount(/static,StaticFiles(directorystatic),namestatic)templatesJinja2Templates(directorytemplates)app.get(/page)asyncdefpage(request:Request):returntemplates.TemplateResponse(page.html,{request:request})模板中引用!-- 使用 url_for 动态生成路径 --linkrelstylesheethref{{ url_for(static, path/css/style.css) }}scriptsrc{{ url_for(static, path/js/app.js) }}/scriptimgsrc{{ url_for(static, path/images/logo.png) }}altlogourl_for的第一个参数是mount时的name第二个参数path是文件在静态目录中的相对路径。五、SPA 前端托管完整方案Vue / React 等单页应用需要所有未匹配路径返回index.html方案一中间件 fallbackfromfastapiimportFastAPI,Requestfromfastapi.staticfilesimportStaticFilesfromfastapi.responsesimportFileResponse appFastAPI()# API 路由app.get(/api/data)asyncdefget_data():return{data:hello}# 静态资源js/css/imagesapp.mount(/assets,StaticFiles(directorydist/assets),nameassets)# SPA fallback未匹配的路由返回 index.htmlapp.get(/{full_path:path})asyncdefserve_spa(request:Request,full_path:str):returnFileResponse(dist/index.html)方案二自定义静态文件中间件importosfromfastapiimportFastAPI,Requestfromfastapi.responsesimportFileResponse,Responsefromstarlette.middleware.baseimportBaseHTTPMiddleware appFastAPI()DIST_DIRdistclassSPAMiddleware(BaseHTTPMiddleware):asyncdefdispatch(self,request:Request,call_next):responseawaitcall_next(request)# 如果路由返回 404 且是 HTML 请求返回 index.htmlifresponse.status_code404:acceptrequest.headers.get(accept,)iftext/htmlinaccept:index_pathos.path.join(DIST_DIR,index.html)ifos.path.exists(index_path):returnFileResponse(index_path)returnresponse app.add_middleware(SPAMiddleware)app.mount(/assets,StaticFiles(directoryf{DIST_DIR}/assets),nameassets)方案三纯静态挂载最简单appFastAPI()# API 路由app.get(/api/data)asyncdefget_data():return{data:hello}# 静态文件htmlTrue 自动处理 index.htmlapp.mount(/,StaticFiles(directorydist,htmlTrue),namespa)局限htmlTrue只在请求路径对应.html文件存在时返回不支持 SPA 的动态路由如/user/123。六、文件上传与静态文件服务结合importosimportuuidfromfastapiimportFastAPI,UploadFile,Filefromfastapi.staticfilesimportStaticFiles appFastAPI()UPLOAD_DIRuploadsos.makedirs(UPLOAD_DIR,exist_okTrue)app.post(/upload)asyncdefupload_file(file:UploadFileFile(...)):# 生成唯一文件名extos.path.splitext(file.filename)[1]filenamef{uuid.uuid4().hex}{ext}filepathos.path.join(UPLOAD_DIR,filename)# 保存文件withopen(filepath,wb)asf:contentawaitfile.read()f.write(content)return{filename:filename,url:f/uploads/{filename},}# 挂载上传目录app.mount(/uploads,StaticFiles(directoryUPLOAD_DIR),nameuploads)七、生产环境注意事项1. Nginx 反向代理直接服务静态文件生产环境建议由 Nginx 直接处理静态文件性能更好server { listen 80; server_name example.com; # Nginx 直接服务静态文件 location /static/ { alias /var/www/static/; expires 30d; add_header Cache-Control public, immutable; } # API 请求转发给 FastAPI location /api/ { proxy_pass http://127.0.0.1:8000; } }2. 缓存控制fromstarlette.responsesimportResponsefromfastapi.staticfilesimportStaticFilesclassCachedStaticFiles(StaticFiles):asyncdeflookup_path(self,path:str):full_path,stat_resultawaitsuper().lookup_path(path)ifstat_result:# 根据文件扩展名设置缓存ifpath.endswith((.js,.css,.woff2,.png,.jpg)):self.headers[Cache-Control]public, max-age31536000, immutableelse:self.headers[Cache-Control]public, max-age3600returnfull_path,stat_result app.mount(/static,CachedStaticFiles(directorystatic),namestatic)3. 目录安全风险防护措施目录遍历攻击StaticFiles默认禁止..路径敏感文件泄露不要将配置文件、.env放在静态目录上传恶意文件限制文件类型、重命名文件、隔离上传目录大文件消耗带宽Nginx 层限制请求体大小八、StaticFilesvs 其他方案方案适用场景性能灵活性StaticFiles开发环境、小型项目中低Nginx 直接服务生产环境高高CDN全球分发、高流量最高最高云存储OSS/S3用户上传文件、海量存储高高推荐开发环境 → StaticFiles零配置 生产环境 → Nginx 直接服务静态文件 CDN 加速 用户上传 → 云存储OSS / S3 CDN九、完整示例fromfastapiimportFastAPI,Request,UploadFile,Filefromfastapi.staticfilesimportStaticFilesfromfastapi.responsesimportFileResponseimportos,uuid appFastAPI()# ---- 目录准备 ----os.makedirs(static/css,exist_okTrue)os.makedirs(static/js,exist_okTrue)os.makedirs(uploads,exist_okTrue)# ---- API 路由 ----app.get(/api/hello)asyncdefhello():return{message:Hello, FastAPI!}app.post(/api/upload)asyncdefupload(file:UploadFileFile(...)):extos.path.splitext(file.filename)[1]filenamef{uuid.uuid4().hex}{ext}withopen(fuploads/{filename},wb)asf:f.write(awaitfile.read())return{url:f/uploads/{filename}}# ---- 静态文件挂载 ----app.mount(/static,StaticFiles(directorystatic),namestatic)app.mount(/uploads,StaticFiles(directoryuploads),nameuploads)# ---- SPA fallback放最后----app.get(/{full_path:path})asyncdefspa_fallback(request:Request,full_path:str):returnFileResponse(static/index.html)十、注意事项mount必须放在路由注册之后否则会拦截所有匹配路径的请求导致 API 路由不可达。目录必须存在默认check_dirTrue目录不存在会抛异常。启动前确保目录已创建。name参数的作用用于url_for反向生成 URL建议始终设置。开发 vs 生产StaticFiles适合开发生产环境推荐 Nginx / CDN。路径以/结尾访问目录路径时StaticFiles会自动查找index.html需htmlTrue。

相关文章:

FastAPI 静态文件

FastAPI 静态文件学习笔记 一、基本用法 — StaticFiles 1. 挂载静态文件目录 from fastapi import FastAPI from fastapi.staticfiles import StaticFilesapp FastAPI()# 将 ./static 目录挂载到 /static 路径 app.mount("/static", StaticFiles(directory"…...

FastAPI CORS 跨域

FastAPI CORS 跨域学习笔记 一、什么是跨域问题 1. 同源策略 浏览器遵循同源策略(Same-Origin Policy),限制一个源的网页向另一个源发送请求。 同源 协议 域名 端口 三者一致:URL AURL B是否同源原因http://example.com/ahttp:…...

别再乱用 String 了!底层原理、常量池、拼接陷阱全解析

做java开发,String是每天都在用的类,但是绝大部分人只停留在只会写、只会赋值,底层还不是很了解,很多人都有这样的疑惑:明明都是"abc",为什么 有时候相等、有时候不相等?String 到底…...

LangChain vs LlamaIndex:从编排到数据,一文搞清核心区别

目录 摘要 一、核心区别:一句话版本 二、为什么我会觉得它们很像? 三、核心区别:完整对比 四、用 LangChain 的知识理解 LlamaIndex 五、LlamaIndex 的数据处理主线 1. Document 2. Node 3. Index 4. Retriever 5. QueryEngine 六…...

如何快速上手OpenBoardView:5个实用技巧与完整操作指南

如何快速上手OpenBoardView:5个实用技巧与完整操作指南 【免费下载链接】OpenBoardView View .brd files 项目地址: https://gitcode.com/gh_mirrors/op/OpenBoardView OpenBoardView是一款功能强大的开源电路板设计文件查看工具,专为替代传统的&…...

btcrecover技术解析:比特币钱包密码恢复引擎的架构与优化实践

btcrecover技术解析:比特币钱包密码恢复引擎的架构与优化实践 【免费下载链接】btcrecover An open source Bitcoin wallet password and seed recovery tool designed for the case where you already know most of your password/seed, but need assistance in tr…...

家庭暴力预警程序,报警,调解记录上链,为庇护,起诉,提供证据。

定位为 “区块链在社会治理与司法辅助中的应用示例”。一、实际应用场景描述在家庭暴力(Domestic Violence, DV)案件中,受害者常面临以下问题:- 暴力行为多为私密空间发生- 证据易灭失(聊天记录删除、伤情恢复&#xf…...

自建代理池实战:从零搭建高可用IP代理服务应对反爬策略

1. 项目概述与核心价值最近在折腾一个个人项目,需要从多个公开的学术网站和开放数据平台抓取一些研究资料。这事儿听起来简单,但实际操作起来,你会发现一个很现实的问题:很多网站对频繁的、来自同一IP的请求非常敏感,轻…...

AI Agent 入门课:RAG 不是检索外挂,而是 Agent 的知识闭环

在企业知识问答里,最常见的失败并不是“完全搜不到”,而是第一次搜到的内容看起来相关,答案也写得流畅,结论却经不起复核。用户问一句“帮我总结这份文档”,普通 RAG 往往会先搜一批材料,再把结果塞回上下文…...

D2DX:让经典《暗黑破坏神2》在现代PC上焕然一新的完整解决方案

D2DX:让经典《暗黑破坏神2》在现代PC上焕然一新的完整解决方案 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你…...

开源RPA框架openclaw-a2a:基于浏览器自动化的跨应用数据流转实践

1. 项目概述与核心价值最近在折腾一些自动化流程,发现很多场景下,不同应用之间的数据流转是个老大难问题。比如,我想把网页上的表格数据自动录入到某个内部系统,或者把邮件附件里的信息提取出来,更新到数据库里。手动操…...

为什么92%的技术中台项目卡在AISMM第三级?资深架构师手把手拆解生态能力建设的黄金48小时启动法

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与技术生态建设的底层逻辑 AISMM(Artificial Intelligence System Maturity Model)并非孤立的评估框架,而是以系统性、演化性与协同性为内核的技术治理范式…...

Windhawk终极指南:如何通过模块化定制彻底改变Windows使用体验

Windhawk终极指南:如何通过模块化定制彻底改变Windows使用体验 【免费下载链接】windhawk The customization marketplace for Windows programs: https://windhawk.net/ 项目地址: https://gitcode.com/gh_mirrors/wi/windhawk Windhawk是一款革命性的Windo…...

车载以太网之要火系列 - 第35篇:郭大侠学UDS(34/36/37服务)- 环环相扣展神奇,丝滑更新不迷离

写在开篇上回说到,郭靖搞清楚了19服务(看病历)和14服务(擦病历)——疾病潜藏祸患多,杏林郎中手段多。这天,郭靖开着那辆国产智能网联新车,感觉有点不对劲——踩油门反应迟钝&#xf…...

opencv 和opencv_contrib官网 不同版本的下载地址

opencv Releases opencv/opencv https://github.com/opencv/opencv_contrib/releases/tag/4.0.1 Release 3.4.13 opencv/opencv_contrib GitHubhttps://github.com/opencv/opencv_contrib/releases/tag/3.4.13 4.0.1 和3.4.13 都是版本号。下载就行。...

HCIE数通单选题

(单选题)EVPN承载L2VPN业务时,以下哪种类型的路由与CE无关? A. MAC/IP Advertisement Route B. Inclusive Multicast Route C. Ethernet A-D Route D. Ethernet Segment Route 思考中。。。 我们来逐一拆解选项: 1. 为…...

2.LeetCode 1089. 复写零——双指针解法学习笔记

目录 一、题目解析 二、算法原理:双指针法 步骤1:找最后一个“复写”的数 步骤2:处理边界情况 步骤3:从后往前复写 三、代码实现(Java) 四、复杂度分析 五、总结 OJ链接:https://leetco…...

中国词元:构建自主AI生态的“云-端“协同战略

在全球化AI竞赛进入白热化的今天,中国科技企业正在探索一条独特的突围路径。当国际科技巨头通过封闭云帝国垄断AI基础设施时,中国产业界提出了"中国词元"的创新概念——通过整合本土模型、国产算力和绿色能源,构建自主可控的AI生态…...

3分钟终极指南:qmcdump轻松解锁QQ音乐加密文件,实现音乐自由播放

3分钟终极指南:qmcdump轻松解锁QQ音乐加密文件,实现音乐自由播放 【免费下载链接】qmcdump 一个简单的QQ音乐解码(qmcflac/qmc0/qmc3 转 flac/mp3),仅为个人学习参考用。 项目地址: https://gitcode.com/gh_mirrors/…...

学之思开源考试系统:3步快速搭建专业在线考试平台的完整指南

学之思开源考试系统:3步快速搭建专业在线考试平台的完整指南 【免费下载链接】xzs-mysql 学之思开源考试系统是一款 java vue 的前后端分离的考试系统。主要优点是开发、部署简单快捷、界面设计友好、代码结构清晰。支持web端和微信小程序,能覆盖到pc机…...

mysql数据库读写分离策略与性能分析_通过中间件实现自动路由

...

本土化赋能:Gitee如何重塑中国开发者的代码托管体验

在数字化转型加速的今天,代码托管平台已成为企业技术基础设施的重要组成部分。对于中国开发者而言,一个能够兼顾性能、合规与本地化支持的平台显得尤为重要。Gitee作为国内领先的代码托管服务,正通过其独特的本土化优势,为开发者提…...

WarcraftHelper:魔兽争霸3终极兼容性修复指南,让经典游戏在现代电脑流畅运行

WarcraftHelper:魔兽争霸3终极兼容性修复指南,让经典游戏在现代电脑流畅运行 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还…...

Install-TidGi-Windows-x64安装步骤详解(附TidGi知识库搭建教程)

Install-TidGi-Windows-x64.exe是 TidGi(太记)​ 桌面知识管理软件的 Windows 64位 安装包。这玩意儿是基于 TiddlyWiki 做的笔记和知识管理工具,带自动 Git 备份、能当博客用,搞个人知识库的人用得挺多。 一、准备工作 下载安装包…...

集团首都公报:继美国谷歌公司、苹果公司之后,世界第三家手机控制系统公司(即     武汉市放飞炬人控制系统有限公司)今天2026年5月6日9点36分获得官方批准。

集团首都公报:继美国谷歌公司、苹果公司之后,世界第三家手机控制系统公司(即 武汉市放飞炬人控制系统有限公司)今天2026年5月6日9点36分获得官方批准。...

08-MLOps与工程落地——模型注册表与模型服务

模型注册表与模型服务(MLflow Model Registry、Seldon Core) 一、模型注册表概述 1.1 什么是模型注册表? import matplotlib.pyplot as plt from matplotlib.patches import Rectangle, FancyBboxPatch import warnings warnings.filterwarni…...

3分钟手机端刷入Android内核:Horizon Kernel Flasher终极指南

3分钟手机端刷入Android内核:Horizon Kernel Flasher终极指南 【免费下载链接】HorizonKernelFlasher A simple app that can flash AnyKernel flashable zips on android 项目地址: https://gitcode.com/gh_mirrors/ho/HorizonKernelFlasher 还在为刷内核必…...

如何在XSLT中将动态字段值(如姓名)安全注入HTML链接的URL参数

...

【控制】基于使用Koopman算子识别的多面体不确定性LPV系统的鲁棒非线性模型预测控制 附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...

【无人机】基于无人机UAV和物联网IoT的奶牛健康监测系统算法实现附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 🍊个人信条:格物致知,完整Matla…...